Профилирование Entity Framework Core с использованием SQL Server Profiler

Когда вы смотрите на SQL Server Profiler при профилировании операторов Entity Framework LINQ, возникает много событий, которые запускаются. Какие события следует отслеживать в профилировщике для оптимизации запросов LINQ?

Я догадался SQL:BatchCompleted и и RPC:Completed быть актуальными запросами, которые выполняются, но в чем разница?

2 ответа

RPC:Completed является завершением удаленного вызова процедуры, что означает, что хранимая процедура была вызвана из внешнего приложения. EF Core в вашем случае зовет sp_executesql хранимая процедура для выполнения SQL, сгенерированного из запросов LINQ.

SQL:BatchCompleted означает, что набор операторов SQL был выполнен. Это может быть набор операторов DDL или DML или вызовы хранимых процедур.

Я понял, что SQL:BatchCompleted и RPC: завершены, чтобы быть фактическими запросами, которые выполняются, но в чем разница?

SQL:BatchCompleted событие указывает на то, что специальный (не параметризованный) пакет из одного или нескольких операторов завершил выполнение. RPC:Completed Событие завершения возникает, когда запрос удаленного вызова процедуры завершает выполнение, которое может быть параметризованным оператором SQL или прямым вызовом хранимой процедуры.

EF использует API SqlClient для выполнения параметризованных запросов. SqlClient использует специальный sp_executesql хранимая процедура для выполнения параметризованных запросов, так что это то, что появляется в след Профилировщик показывает десериализованный запрос как exec sp_executesql N'..., включая значения параметров в виде текста. Фактические параметры отправляются в SQL в собственном (двоичном) формате.

Эти события включены в стандартный шаблон трассировки Profiler вместе с другими событиями, которые регистрируют входы в систему, выходы из системы. Обратите внимание, что когда вы видите последовательность событий Audit Logout, 'sp_reset_connection` и Audit Login, они происходят, когда первый запрос выполняется для повторно используемого соединения в пуле и были вызваны последующим RPC для того же сеанса, который вы видите в трассировке. Все они являются внутренними на стороне сервера, а не в результате отдельных запросов, отправленных от клиента.

РЕДАКТИРОВАТЬ:

Я вижу, у вас есть вопрос оптимизации запроса в вашем вопросе. Для устранения проблем производительности проблемных запросов вы можете выполнить захваченный запрос с помощью SQL Server Management Studio с параметром просмотра фактического плана выполнения. Вы также можете зафиксировать план в трассировке, добавив Showplan XML событие, но следует делать это только в блоке разработчика с отфильтрованной трассировкой, чтобы избежать накладных расходов и повлиять на рабочую нагрузку. Нефильтрованная трассировка профиля в производстве - это плохо.

Другие вопросы по тегам