2008-11-25 2 views
4

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

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

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

Моя лучшая стратегия до сих пор заключается в добавлении «случайного» номера в мой запрос и фильтрации для него в трассировке.

LINQ:

where o.CompletedOrderID != "59872547981" 

Profiler фильтр:

'TextData' like '%59872547981' 

Это прекрасно работает с парой оговорок:

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

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

+1

Решение, которое я вам предоставил, может помочь вам: http: // stackoverflow.com/a/41263883/56286 – Fabrice 2016-12-23 16:25:53

ответ

5

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

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

from someobject in dc.SomeTable 
where someobject.xyz = 123 
select new { MyObject = someobject, QueryTraceID1234132412='boo' } 
1

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

using System.Diagnostics.Debugger; 

yourDataContext.Log = new DebuggerWriter(); 

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

+0

Я специально сказал, что нашел этот подход неадекватным :) его слишком большая боль - и особенно если запрос не всегда то же самое, что трудно найти или даже знать, что искать. – 2008-11-25 03:22:22

3

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

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

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

+0

это замечательно. Я предполагаю, что его поиск довольно прост в поиске по моему сетевому идентификатору, чтобы найти тонкие в реальном времени, когда они появляются, но я еще не пробовал это. – 2008-11-25 04:00:46

Смежные вопросы