Per ogni istruzione di inserimento vedo sp_executesql in SQL Server Profiler


4

Lavorando sulla messa a punto del nostro database e delle query per uno dei nostri prodotti, ho deciso di aprire il Profiler nell'ambiente di controllo qualità e vedere cosa mostra.

Ho visto per ogni inserto che ho chiamato, è stata effettuata una chiamata a sp_executesql con il testo dell'istruzione insert.

Questo sembra essere un grande successo, c'è un modo per disattivarlo?

Ambiente:

  • SQL Server 2008 R2 Standard
  • Windows Server 2008 R2 Enterprise
  • 32 GB di RAM
  • 2x4 Xeon
9

Non mi preoccuperei troppo.

L'idea è di parametrizzare le dichiarazioni per il riutilizzo.Cioè, evitare la compilazione

Considera che hai 3 diversi clienti che eseguono 3 dichiarazioni separate:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

Ognuno di questi ha un testo diverso, pertanto verrà compilato su un piano diverso.Cioè, 3 compila e 3 piani in cache.

Ora, questi 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'

Il piano riutilizzabile qui è per la dichiarazione SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 quindi hai un piano è cache.

Nei sistemi occupati, questo tempo di compilazione è importante.E la maggior parte delle domande è più complessa di questa, ovviamente: puoi vederla spesso per la prima volta rispetto ai tempi di esecuzione successivi (vedi Testing Query Speed)

Inoltre, nei sistemi complessi e occupati, pianificare la dimensione della cache potrebbe essere limitata o togliere la RAM dalla cache dei dati (pool di buffer) che può anche ostacolare le cose.L'estremo potrebbe essere un piano di 10000 o uno per un'app web impegnativa.(L'effetto dipende dalle sottigliezze da 32 a 64 bit)

Alcuni ORM e driver ti consentono di disattivarlo, di solito "istruzioni preparate" o alcune opzioni: ma tieni presente che può rallentare le cose.Hai detto "questo sembra essere un grande successo", il che implica che sei preoccupato per il carico ...

+2

Ottima spiegazione di * perché * alcuni sistemi lo fanno.Consente loro di parametrizzare il loro SQL senza utilizzare stored procedure. 15 set. 112011-09-15 19:06:11


4

Non sono sicuro di aver capito, vuoi smettere di usare sp_executesql?In tal caso, è sufficiente modificare il codice per non utilizzare questo metodo.Credo che l'oggetto SQLCommand in .NET utilizzerà sp_executsql, quindi se stai usando .NET allora dovresti aspettarti di vedere questa chiamata.


5

Se si utilizza la maggior parte degli ORM (Link2SQL, EF, ecc.), Si utilizza questo piccolo e delizioso metodo.Se stai scrivendo un'istruzione di inserimento parametrizzata, verrà eseguita anche in questo metodo.

  0

Quindi non posso aggirare questo usando inserti parametrici?Come ... a tutti? 15 set. 112011-09-15 13:05:38

  0

No.La tua unica opzione sarebbe quella di utilizzare la tua stored procedure. 15 set. 112011-09-15 17:19:53