LINQ-to-Entities избавляется от sp_executesql - PullRequest
3 голосов
/ 27 июня 2010

Я пытаюсь оптимизировать свою базу данных, используя Помощник по настройке ядра СУБД , и проблема, с которой я сталкиваюсь, заключается в том, что моя трассировка SQL Profiler показывает тонны запросов, выполненных с использованием sp_executesql - и советнику не удается обработать те. Кажется, что эти запросы поступают от LINQ-to-Entities, которые я использую, поэтому просто любопытно, есть ли способ заставить LINQ-to-Entities вызывать операторы напрямую.

Ответы [ 4 ]

6 голосов
/ 25 июля 2012

LINQ / .NET выполняет запросы SQL, отправляя их как sp_executesql вызовы на сервер SQL. Однако Помощник по настройке ядра СУБД не может проанализировать такие, SQL Server Profiler , захваченные операторы, поэтому результат сеанса настройки будет плохим.

Вот как я 'распаковываю' операторы sp_executesql перед передачей их в помощник по настройке ядра СУБД, чтобы он мог их правильно проанализировать.

  1. После того, как вы запустили (или открыли существующий) сеанс настройки в SQL Server Profiler , используйте Файл> Экспорт> Извлечь события SQL Server> Извлечь события Transact-SQL ... сохранить файл .SQL, содержащий все операторы SQL.
  2. Откройте файл .SQL (например, Notepad ++ 6 - http://notepad -plus-plus.org / ) и запустите следующее Регулярное выражение поиска и замены, чтобы распаковать все sp_executesql заявления для простого TSQL. Найти: ^EXEC[\s]+SP_EXECUTESQL[\s]+[N]*'((''|[^'])*)'[\s]*,[\s]*[N]*'((''|[^'])*)'[\s]*,[\s]*([^\n]+)$ Заменить: BEGIN\nDECLARE \3\nSELECT \5\n\1\nEND
  3. Далее, используйте «распакованный» файл .SQL, который мы только что создали в Помощник по настройке ядра СУБД , чтобы узнать, какие индексы вам нужно добавить.

Удачного тюнинга! Обратите внимание, что я выбрал Notepad ++ 6 (или выше), так как он имеет довольно хорошую реализацию регулярных выражений, другие текстовые редакторы могут не выполнить указанное выше выражение.

4 голосов
/ 27 июня 2010

Согласен с Адамом. Использование sp_executesql в платформе сущностей / ADO.net является преднамеренным. Затем запросы выполняются аналогично параметризованному хранимому процессу, и оптимизатор SQL может повторно использовать план запроса.

Если вы хотите настроить свою БД, вам следует рассмотреть и эти запросы. Я предлагаю вам сделать резервную копию вашей БД, захватить запросы, используя шаблон трассировки воспроизведения (в вашем профилировщике SQL), восстановить вашу БД, запустить настройку советника по настройке своей рабочей нагрузки для этой трассировки

3 голосов
/ 28 июня 2010

Это просто артефакт того, как вызовы RPC отображаются в профилировщике.Существует два основных типа клиентских запросов: язык (тип 0x01) и RPC (тип 0x03), как описано в документации Бесплатный протокол TDS .Когда вызов представляет собой пакет SQL с параметрами, вызов RPC будет иметь тип 0x03 с длиной 0x0A, что является сокращением для sp_executesql.

Итак, вы видите, что действительно происходит, когда клиент1006 * любой клиент , отправляет пакет, содержащий параметры, и будет выглядеть так, как будто sp_executesql вызывается.Это верно для ODBC, для OleDB, SqlClient, Sql Native Client, как я уже сказал, любой клиент.Так что ни Entity Framework, ни ADO.Net на самом деле не вызывают sp_executesql (на самом деле процедура даже не вызывается, хотя запросы выполняются так, как если бы она была вызвана. Сложно ...).Это артефакт протокола, который происходит каждый раз, когда вы добавляете @parameter к вашему запросу.

2 голосов
/ 27 июня 2010

Использование sp_executesql является эффектом ADO.NET, а не чем-то специфичным для Entity Framework.Насколько мне известно, нет способа дать указание не использовать эту хранимую процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...