使用Linq to SQL安排SQL查询时间的好方法

时间:2020-03-05 18:56:58  来源:igfitidea点击:

使用Linq to SQL时,有没有计时SQL查询的好方法?我真的很喜欢日志记录功能,但是如果我们能以某种方式还可以安排该查询的时间,那就太好了。有任何想法吗?

解决方案

回答

我们使用SQL事件探查器通过LLBLGen Pro测试我们的查询。

回答

我们可以使用" System.Diagnostics.Stopwatch",它将允许我们跟踪查询执行的时间。只要记住,直到对它们进行枚举之前,Linq-> SQL查询才会执行。还要注意,如果我们登录到" Console.Out",将会对性能产生重大影响。

回答

最好的方法是将查询记录到文件中,然后使用SQL事件探查器对查询进行计时并调整查询索引。

回答

正如两个人已经说过的那样,SQL Profiler是用于此目的的现成工具。我不想成为一个回声,但我想详细一点:它不仅提供了来自SQL Server的实际计时(与来自应用程序端的网络I / O,连接和连接的计时相反)池计时已添加到蛋糕中),但它也为我们提供[通常更重要的] I / O统计数据,锁定信息(根据需要)等。

I / O统计信息很重要的原因是,非常昂贵的查询可能会在消耗大量服务器资源的同时快速运行。例如,如果执行的查询经常命中大型表,并且没有匹配的索引导致表扫描,则受影响的表将由SQL Server缓存在内存中(如果可以)。有时,这可能导致同一查询快速执行,而实际上,它吞噬了服务器资源,从而损害了系统/ app / db的其余部分。

锁定信息几乎同样重要->由于锁定和阻塞,对单个记录执行PK查找的微小查询可能会出现错误的计时。我在某个地方读到,这个网站在早期的beta时代就陷入了僵局。 SQL Profiler也是朋友,可用于识别和解决由锁定引起的问题。

总结一下;无论我们要使用L2S,EF,普通ADO,还是要确保对数据库的应用"表现良好",在开发和测试期间始终准备好SQL Profiler。它得到了回报!

编辑:自从我写下上面的答案以来,我已经为L2S开发了一个新的运行时分析工具,该工具将两全其美融合在一起。 SQL Server的I / O统计信息和服务器端计时,SQL Server执行计划,SQL Server的"缺失索引"警报,以及托管调用堆栈,可以轻松地查找是什么代码生成了某个查询,以及一些高级筛选器选项仅记录满足特定条件的查询。此外,日志记录组件可以与应用程序一起分发,以使实时客户环境中的运行时查询配置文件更加容易。可以从以下位置下载该工具:

http://www.huagati.com/L2SProfiler/,我们还可以在其中获得免费的45天试用许可证。

更详细的背景说明和该工具的介绍也发布在这里:
http://huagati.blogspot.com/2009/06/profiling-linq-to-sql-applications.html

...以及使用一些更高级的过滤器选项的示例/演练可在此处获得:
http://huagati.blogspot.com/2009/08/walkthrough-of-newest-filters-and.html

回答

SQL Profiler获取查询和时间,以及查询分析器中的执行路径以查看瓶颈在哪里。

回答

我们可以做的是向DataContext.Log中添加一个自定义TextWriter实现,该实现会将生成的sql写到文件或者内存中。然后循环遍历这些查询,并使用原始ADO.NET代码执行它们,并用秒表将它们包围起来。

我之前使用过类似的技术,因为似乎每当我开发一些代码时,我都不会打开Profiler,并且将这些结果输出到HTML页面确实很容易。确保在每个网站请求中两次执行它们,但这有助于尽快查看执行时间,而不必等到我们在Profiler中发现某些东西后再进行操作。

另外,如果我们要使用SQL工具路线,我建议我们使用谷歌搜索"最慢查询DMV"并获取一个存储过程,该存储过程可以为我们提供数据库中最慢查询的统计信息。滚动探查器结果以查找不良查询并不总是那么容易。同样,通过对sql 2005的dmv进行正确的查询,我们还可以通过说cpu vs. time等来进行排序。