Умные трюки, чтобы найти конкретные запросы LINQ в SQL Profiler - PullRequest
4 голосов
/ 25 ноября 2008

Профилирование запросов LINQ и их планов выполнения особенно важно из-за сумасшедшего SQL, который иногда можно создать.

Я часто нахожу, что мне нужно отследить определенный запрос, и мне трудно найти его в анализаторе запросов. Я часто делаю это в базе данных, в которой много запущенных транзакций (иногда на производственном сервере), поэтому просто открывать Profiler не годится.

Я также обнаружил, что пытаюсь использовать DataContext для отслеживания неадекватности, поскольку он не дает мне SQL, который я на самом деле могу выполнить сам.

Моя лучшая стратегия на данный момент - добавить случайное число в мой запрос и отфильтровать его в трассировке.

LINQ:

where o.CompletedOrderID != "59872547981"

Фильтр профилировщика:

'TextData' like '%59872547981'

Это прекрасно работает с парой предостережений:

  • Я должен быть осторожен, чтобы не забыть удалить критерии или выбрать что-то, что не сильно повлияет на план запроса. Да, я знаю, оставляя это, мы просим о неприятностях.
  • Насколько я могу судить, даже при таком подходе мне нужно запускать новую трассировку для каждого запроса LINQ, который мне нужно отслеживать. Если перейти к «Файл> Свойства» для существующей трассировки, я не могу изменить критерии фильтра.

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

Ответы [ 3 ]

5 голосов
/ 25 ноября 2008

Возможно, неуместно использовать предложение where, поскольку это может повлиять на планы выполнения ваших запросов.

Вместо этого сделайте что-нибудь интересное с проекцией в анонимные классы - используйте уникальное статическое имя столбца или что-то, что не повлияет на план выполнения. (Таким образом, вы можете оставить его нетронутым в производственном коде на случай, если впоследствии вам потребуется выполнить какое-либо профилирование производственного кода ...)

from someobject in dc.SomeTable
where someobject.xyz = 123
select new { MyObject = someobject, QueryTraceID1234132412='boo' }
3 голосов
/ 25 ноября 2008

Вы можете использовать визуализатор отладки Linq to SQL - http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx и увидеть его в окне просмотра.

Или вы можете использовать DataContext.GetCommand();, чтобы увидеть SQL перед его выполнением.

Вы также можете посмотреть на DataContext.GetChangeSet(), чтобы посмотреть, что будет вставлено / обновлено или удалено.

1 голос
/ 25 ноября 2008

Вы можете сделать так, чтобы ваш datacontext вышел из необработанного SQL-кода, который затем можно было найти в профилировщике для проверки производительности.

using System.Diagnostics.Debugger;

yourDataContext.Log = new DebuggerWriter();

Все ваши SQL-запросы теперь будут отображаться в окне вывода отладчика.

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