2011-01-16 5 views
-3

J'ai une requête, vous pouvez voir l'exemple ci-dessous:Pourquoi exécuter une requête SQL prend beaucoup de temps?

SELECT TOP(50000)* FROM 
[Database].[dbo].[Table] WHERE Column 
IS NOT NULL ORDER BY Column2 DESC 

Pour l'exécuter prend 2 min 21 sec, dans les dossiers au total sur les 350K

types Colonnes

ID int 
Column1 nvarchar(50) 
Column2 nvarchar(250) 
Column3 datetime 
Column4 nvarchar(1000) 
Column5 nvarchar(1000) 
Column6 nvarchar(50) 

À mon avis, cela prend trop de temps. quelqu'un peut-il me suggérer comment améliorer la performance? Ou peut-être quelqu'un sait ce qui peut être la cause première?

+1

Pouvez-vous poster le plan d'exécution? –

Répondre

0

Avez-vous mis un index sur column2 (celui utilisé pour la commande par)?

+0

Oui je index sur cette colonne USE [Base de données] GO CREATE NONCLUSTERED INDEX [ID] ON [dbo]. [Tableau] ( \t [ID] DESC ) AVEC (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO – Bogdan

+0

Cela ressemble à un index sur la colonne "id" et non sur "column2" ou 'column' (celui sur lequel vous filtrez, qui n'est pas dans la description de la table.) – Inca

1

Vous renvoyez une grande quantité de données - réseau IO peut facilement tenir compte du temps pris.

Vous pouvez également manquer un index sur votre colonne column2, ce qui peut provoquer un balayage de table au lieu d'une recherche d'index (opération coûteuse vs bon marché).

3

Plusieurs choses:

  • Avez-vous un index sur la "colonne" où vous filtre? Le numéro de colonne n'est pas dans votre question
  • Cela peut ne pas vous aider, vous avez SELECT *
  • L'index utilise-t-il column2?
  • Avez-vous essayé séparément?

Conception

  • Avez-vous besoin nvarchar? Make it varchar

Fondamentalement, vous retournez environ 1/7 de la table afin que tout index sur la colonne de filtre puisse être ignoré, associé à SELECT *. Un index sur column2 peut aider à éviter le tri intermédiaire.

Edit:

Avec 3 colonnes, vous pouvez le faire covering (comme commentaire de marc_s)

+0

Ok, j'ai changé mes types de colonnes en varchar et je l'ai réduit. La même requête prend maintenant 1 min, 14 sec. Merci. Y at-il autre chose que je peux améliorer pour le rendre plus rapide? – Bogdan

+0

Aussi à la place de * tout j'ai changé pour sélectionner 3 colonnes et maintenant cela ne prend pas plus de 25 secondes sur la même requête – Bogdan

+1

@Bogdan: si vous aviez un index qui aurait ces trois colonnes vous avez besoin - éventuellement comme des colonnes INCLUDE - alors vous pourriez voir un autre gros coup de pouce dans la performance –

Questions connexes