Для каждого оператора вставки я вижу sp_executesql в профиле SQL Server


4

Работая над настройкой нашей базы данных и запросов для одного из наших продуктов, я решил вскрыть Profiler в среде QA и посмотреть, что он показывает.

Я видел для каждой вставляемой мной вставки, был вызван sp_executesql с текстом инструкции insert.

Это, кажется, большой удар, есть ли способ отключить это?

Окружающая среда:

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

Я бы не стал слишком беспокоиться.

Идея заключается в параметризации операторов для повторного использования. То есть, не компилировать

Рассмотрим у вас есть 3 различных клиенты работают 3 отдельные заявления:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1 

SELECT col1, col2 FROM SomeTable WHERE col3 = 15 

SELECT col1, col2 FROM SomeTable WHERE col3 = 42 

Каждый из них имеет разный текст, следовательно, будет скомпилирован в другой план. То есть, 3 компиляции и 3 плана в кешировании.

Теперь, эти 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' 

Повторно использовать план здесь для заявления SELECT col1, col2 FROM SomeTable WHERE col3 = @p0 поэтому у вас есть один план кэша.

В занятых системах это время компиляции имеет значение. И большинство запросов более сложны, чем это, конечно: вы можете часто видеть это для 1-го запуска и последующего времени выполнения (см. Testing Query Speed)

Также в сложных и занятых системах планировать размер кеша можно ограничить или отвлечь RAM от данных кеш (буферный пул), что также может помешать. Крайним может быть 10000 планов или один для занятого веб-приложения. (Эффект зависит от 32-ти и 64-битных тонкостей)

Некоторые ORM и драйверы позволяют вам отключить это, обычно «подготовленные заявления» или какой-то вариант: но будьте осторожны, это может замедлить работу. Вы сказали: «Это кажется большим хитом», что подразумевает, что вас беспокоит загрузка ...

+2

Отличное объяснение * почему * некоторые системы делают это. Он позволяет им параметризовать их SQL без использования хранимых процедур. 15 сен. 112011-09-15 19:06:11


4

Я не уверен, я понимаю, вы хотите прекратить использование sp_executesql? Если это так, вам просто нужно изменить свой код, чтобы не использовать этот метод. Я считаю, что объект SQLCommand в .NET будет использовать sp_executsql, поэтому, если вы используете .NET, тогда вы должны ожидать увидеть этот вызов.


5

Если вы используете большинство ORM (Link2SQL, EF и т. Д.), Они вызывают использование этого прекрасного метода. Если вы пишете параметризованную инструкцию insert, она также будет реализована в этом методе.

  0

Так что я не могу обойти это, используя параметризованные вставки? Как ... вообще? 15 сен. 112011-09-15 13:05:38

  0

Нет. Единственным вариантом будет использование вашей собственной хранимой процедуры. 15 сен. 112011-09-15 17:19:53