Профилирование 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
событие, но следует делать это только в блоке разработчика с отфильтрованной трассировкой, чтобы избежать накладных расходов и повлиять на рабочую нагрузку. Нефильтрованная трассировка профиля в производстве - это плохо.