2009-02-23 8 views
4

Pourquoi est-ce que si j'exécute ma requête en tant que procédure paramétrée, elle s'exécute 10 fois plus vite que si je l'exécute directement en tant que requête paramétrée?Pourquoi la requête est-elle lente mais la procédure est-elle rapide sur SQL Server?

J'utilise la même requête exacte dans les deux cas, et il n'a pas d'importance si je vous appelle de Management Studio ou un SqlCommand de code. EDIT: Le plan d'exécution semble différent.

Alors pourquoi? Je l'appelle avec EXACTEMENT le même ensemble de paramètres.

EDIT: Après plus de tests, il semble que le ralentissement 10x ne se produit que lors de l'exécution de la requête SQL paramétrées de gestion Studio.

Répondre

10

Une chose que j'ai vu récemment est que si vous configurez les paramètres de la requête mal peut causer des problèmes majeurs. Par exemple, supposons que vous ayez un paramètre pour une colonne varchar indexée et que vous le configuriez à partir de .Net à l'aide de la méthode AddWithValue() de SqlCommand. Vous êtes dans un monde de mal avec ce scénario. .Net utilise des chaînes Unicode et configurera votre paramètre en tant que nvarchar plutôt qu'en tant que varchar. Maintenant, le serveur sql ne pourra pas utiliser votre index, et vous verrez une pénalité de performance significative.

+0

C'est un très bon point, j'ai été blessé par cela avant. –

+0

J'ai aussi récemment vu ce comportement. Peut causer des problèmes de performance majeurs. – Kibbee

+0

@Kibbee: Je pense que ce sont vos commentaires dans une autre question SO il y a un mois ou deux qui m'ont poussé à enquêter sur le comportement. Heureusement, je n'utilise jamais AddWithValue et je spécifie toujours le type de paramètre explicitement, donc ce n'était pas un problème dans mon ancien code. –

4

savoir si elles utilisent le même plan d'exécution est pour l'afficher lors de l'exécution. Utilisez "include real plan execution" dans le studio de gestion et voyez quelle est la différence.

+0

tu me bats à la réponse - je tapais quand votre réponse est arrivée. – SAMills

2

requêtes paramétrées ont beaucoup de advantages, y compris souvent un rendement de lourdes augmentations.

  • Mise en cache des requêtes
  • Chaîne de problèmes de concaténation minimisés
  • adressage injection SQL
  • données et ne pas être converti en une chaîne avant de traiter
+0

"requête avec paramètres" serait une requête paramétrée, n'est-ce pas? – Powerlord

+0

Du point de vue du serveur, non. Le paramétrage se passe du côté client si vous en faites une requête avec des paramètres. C'est en supposant que vous parlez de faire une requête avec des paramètres dans ADO/ADO.net. –

+0

désolé mon erreur, je n'ai même pas testé la méthode de requête d'injection SQL. –

-1

Les procédures stockées peuvent courir plus vite parce que le plan d'exécution est mis en cache par le serveur SQL.

Mais 10 fois les performances sont suspectes. Est-ce que la première exécution est la première fois que vous avez effacé les plans d'exécution stockés? Vous pouvez utiliser ces commandes pour effacer le cache. Mais ils effacent tout le cache des serveurs, donc ne le faites que sur les serveurs de développement. Exécutez-les directement sur le serveur SQL pour éliminer les E/S réseau des tests de performances?

Je pense qu'il fonctionne lentement la première fois, puis une fois qu'il est mis en mémoire cache, il est en cours d'exécution plus rapide.

+0

Toutes les requêtes ne sont-elles pas mises en cache dans la version 2005 et ultérieure? – CJM

+0

Oui, les requêtes paramétrées sont mises en cache de la même manière que les sprocs. –

3

Les paramètres de niveau de connexion peuvent être critiques dans certains cas, en particulier ANSI NULLS, CONCAT NULL YIELDS NULL, etc. En particulier, si vous avez calculé persista colonnes indexées (y compris promus « xml » colonnes), il ne fera pas confiance la valeur d'index précalculée si les paramètres ne sont pas compatibles, et recalculera pour chaque ligne (c.-à-d. scan de table au lieu de recherche d'index).

Questions connexes