Sql server 在SQL分析器中查找特定LINQ查询的巧妙技巧
分析LINQ查询及其执行计划尤其重要,因为有时会创建疯狂的SQL 我经常发现我需要跟踪一个特定的查询,并且在查询分析器中很难找到它。我经常在有大量正在运行的事务(有时是生产服务器)的数据库上执行此操作,因此仅打开探查器是没有好处的 我还发现尝试使用DataContext进行跟踪是不够的,因为它没有给我SQL,我实际上可以自己执行 到目前为止,我最好的策略是在我的查询中添加一个“随机”数,并在跟踪中进行过滤 林克: 探查器筛选器:Sql server 在SQL分析器中查找特定LINQ查询的巧妙技巧,sql-server,linq,profiler,Sql Server,Linq,Profiler,分析LINQ查询及其执行计划尤其重要,因为有时会创建疯狂的SQL 我经常发现我需要跟踪一个特定的查询,并且在查询分析器中很难找到它。我经常在有大量正在运行的事务(有时是生产服务器)的数据库上执行此操作,因此仅打开探查器是没有好处的 我还发现尝试使用DataContext进行跟踪是不够的,因为它没有给我SQL,我实际上可以自己执行 到目前为止,我最好的策略是在我的查询中添加一个“随机”数,并在跟踪中进行过滤 林克: 探查器筛选器: 'TextData' like '%59872547981' 这
'TextData' like '%59872547981'
这很好,但需要注意以下几点:
- 我必须小心记住删除条件,或者选择一些不会对查询计划产生太大影响的内容。是的,我知道把它留在家里是自找麻烦
- 但就我所知,即使使用这种方法,我也需要为我需要跟踪的每个LINQ查询启动一个新的跟踪。如果对现有跟踪转到“文件>属性”,则无法更改筛选条件
在你的应用程序中运行一个查询,并在分析器中看到它弹出,而不需要任何额外的努力,这是最棒的。我只是希望其他人能想出比这更好的方法,或者至少建议搜索一个比列上的查询更“危险”的令牌。您可以让datacontext注销原始SQL,然后在探查器中搜索以检查性能
using System.Diagnostics.Debugger;
yourDataContext.Log = new DebuggerWriter();
现在,所有SQL查询都将显示在调试器输出窗口中。搞乱where子句可能不是最好的做法,因为它可能并且会影响查询的执行计划 使用一个唯一的静态列名或者一些不会影响执行计划的东西来做一些奇怪的事情。(这样,您就可以在生产代码中保持原样,以防以后需要对生产代码进行任何分析…)
您可以使用Linq到SQL调试可视化工具,并在监视窗口中查看它 或者可以使用
DataContext.GetCommand()
以在SQL执行之前查看它
您还可以查看
DataContext.GetChangeSet()
以查看将要插入/更新或删除的内容。EFCore有一个功能TagWith()
,正是出于此目的
var nearestFriends =
(from f in context.Friends.TagWith("This is my spatial query!")
orderby f.Location.Distance(myLocation) descending
select f).Take(5).ToList();
不幸的是,您无法使用来查找它们:-)
这是因为查询之前的注释是不正确的
真可惜!希望我不必再等12年。我确实明确说过我发现这种方法不合适:)这太痛苦了——特别是如果查询不总是一样的话,那么很难找到,甚至很难知道要搜索什么。这很好。我假设通过我的网络ID可以很容易地进行搜索,以便在它们出现时实时找到它们,但我还没有尝试过。我在这里提供的解决方案可能会帮助您:
from someobject in dc.SomeTable
where someobject.xyz = 123
select new { MyObject = someobject, QueryTraceID1234132412='boo' }
var nearestFriends =
(from f in context.Friends.TagWith("This is my spatial query!")
orderby f.Location.Distance(myLocation) descending
select f).Take(5).ToList();