Para cada instrucción de inserción, veo sp_executesql en el Analizador de SQL Server


4

Trabajando para ajustar nuestra base de datos y las consultas de uno de nuestros productos, decidí abrir el Perfilador en el entorno de control de calidad y ver qué muestra.

Vi por cada inserción que llamé, se hizo una llamada a sp_executesql con el texto de la declaración de inserción.

Esto parece ser un gran éxito, ¿hay alguna manera de desactivar esto?

Ambiente:

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

No me preocuparía demasiado.

La idea es parametrizar las declaraciones para su reutilización.Es decir, evitar compilar.

Tenga en cuenta que tiene 3 clientes diferentes ejecutando 3 declaraciones separadas:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

Cada uno de estos tiene un texto diferente, por lo tanto, se compilarán en un plan diferente.Es decir, 3 compilaciones y 3 planes en caché.

Ahora, estos 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'

El plan reutilizable aquí es para la declaración SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 por lo que tiene un plan es caché.

En sistemas ocupados, este tiempo de compilación es importante.Y la mayoría de las consultas son más complejas que esto, por supuesto: a menudo se puede ver esto para la primera ejecución frente a los tiempos de ejecución posteriores (ver Testing Query Speed)

También en sistemas complejos y ocupados, el tamaño del caché del plan puede ser limitado o quitar la RAM del caché de datos (grupo de búferes), lo que también puede dificultar las cosas.El extremo podría ser un 10000 planes o uno para una aplicación web ocupada.(El efecto depende de las sutilezas de 32 vs 64 bits)

Algunos ORM y controladores le permiten desactivar esto, normalmente "declaraciones preparadas" o alguna opción: pero tenga en cuenta que puede ralentizar las cosas.Usted dijo "esto parece ser un gran éxito", lo que implica que está preocupado por la carga ...

+2

Gran explicación de * por qué * algunos sistemas hacen esto.Les permite parametrizar su SQL sin utilizar procedimientos almacenados. 15 sep. 112011-09-15 19:06:11


4

No estoy seguro de entender, ¿quieres dejar de usar sp_executesql?Si es así, simplemente necesita cambiar su código para no usar este método.Creo que el objeto SQLCommand en .NET utilizará sp_executsql, por lo que si está utilizando .NET, debería esperar ver esta llamada.


5

Si está utilizando la mayoría de los ORM (Link2SQL, EF, etc.), se utiliza este pequeño y encantador método.Si está escribiendo una declaración de inserción parametrizada, también se aplicará en este método.

  0

¿Entonces no puedo evitar esto usando inserciones parametrizadas?Como ... en absoluto? 15 sep. 112011-09-15 13:05:38

  0

NoSu única opción sería utilizar su propio procedimiento almacenado. 15 sep. 112011-09-15 17:19:53