Pour chaque instruction d'insertion, je vois sp_executesql dans SQL Server Profiler


4

En travaillant sur l'ajustement de notre base de données et de requêtes pour l'un de nos produits, j'ai décidé d'ouvrir Profiler dans l'environnement QA et voir ce qu'il montre.

J'ai vu pour chaque insertion que j'ai appelée, un appel a été fait à sp_executesql avec le texte de l'instruction d'insertion.

Cela semble être un grand succès, est-il un moyen de désactiver cela?

Environnement:

  • SQL Server 2008 R2 Standard
  • Windows Server 2008 R2 Enterprise
  • 32 Go de RAM
  • 2x4 Xeon
9

Je ne m'inquiéterais pas trop.

L'idée est de paramétrer les instructions pour une réutilisation. Cela est, éviter de compiler

Considérez vous avez 3 différents clients exécutent 3 déclarations distinctes:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1 

SELECT col1, col2 FROM SomeTable WHERE col3 = 15 

SELECT col1, col2 FROM SomeTable WHERE col3 = 42 

Chacun d'eux a donc un texte différent sera compilé à un autre plan. C'est, 3 compiles et 3 plans dans le cache.

Maintenant, ces 3

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '1' 

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '15' 

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '42' 

Le plan réutilisable est ici pour la déclaration SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 si vous avez un plan de est cache.

Dans les systèmes occupés, cette heure de compilation est importante. La plupart des requêtes sont plus complexes: vous pouvez souvent voir ceci pour la 1ère exécution contre les suivantes (voir Testing Query Speed)

De même, dans les systèmes complexes et occupés, la taille du cache de plan peut être limitée ou retirer la RAM des données cache (pool de mémoire tampon) qui peut gêner les choses aussi. L'extrême pourrait être un plan de 10000 ou un pour une application web occupée. (L'effet dépend des subtilités 32 vs 64 bits)

Certains ORM et pilotes vous permettent de désactiver cette option, généralement des "instructions préparées" ou une option: mais attention, cela peut ralentir les choses. Vous avez dit "cela semble être un grand succès" qui implique que vous êtes préoccupé par la charge ...

+2

Grande explication de * pourquoi * certains systèmes le font. Il leur permet de paramétrer leur SQL sans utiliser de procédures stockées. 15 sept.. 112011-09-15 19:06:11


4

Je ne suis pas sûr que je comprends, vous voulez arrêter d'utiliser sp_executesql? Si c'est le cas, il vous suffit de modifier votre code pour ne pas utiliser cette méthode. Je crois que l'objet SQLCommand dans .NET utilisera sp_executsql, donc si vous utilisez .NET, vous devriez vous attendre à voir cet appel.


5

Si vous utilisez la plupart des ORM (Link2SQL, EF, etc.), ils sont à l'origine de cette jolie petite méthode. Si vous écrivez une instruction d'insertion paramétrée, elle apparaîtra également dans cette méthode.

  0

Donc, je ne peux pas contourner cela en utilisant des inserts paramétrés? Comme ... du tout? 15 sept.. 112011-09-15 13:05:38

  0

Non. Votre seule option serait d'utiliser votre propre procédure stockée. 15 sept.. 112011-09-15 17:19:53