【发布时间】:2008-09-16 19:50:06
【问题描述】:
在使用 Linq to SQL 时,有没有很好的方法来计时 SQL 查询?我真的很喜欢日志记录功能,但如果你能以某种方式也可以为该查询计时,那就太好了。有什么想法吗?
【问题讨论】:
-
我正在寻找尽可能自动化的方式。用 StopWatch 包围每个查询是可行的,但工作量很大。
标签: .net linq linq-to-sql optimization logging
在使用 Linq to SQL 时,有没有很好的方法来计时 SQL 查询?我真的很喜欢日志记录功能,但如果你能以某种方式也可以为该查询计时,那就太好了。有什么想法吗?
【问题讨论】:
标签: .net linq linq-to-sql optimization logging
正如两个人已经说过的,SQL Profiler 是开箱即用的工具。我不想成为回应,但我想更详细地阐述:它不仅提供来自 SQL Server 的实际时间(而不是来自网络 i/o、连接和连接的应用程序端的时间)池计时已添加到蛋糕中),但它还为您提供 [通常更重要的] I/O 统计数据、锁定信息(根据需要)等。
I/O 统计数据之所以重要,是因为一个非常昂贵的查询可能会在消耗过多服务器资源的同时快速运行。例如,如果执行的查询经常命中大型表并且没有匹配的索引导致表扫描,则受影响的表将由 SQL Server 缓存在内存中(如果可以的话)。这有时会导致相同的查询以极快的速度执行,而实际上它通过消耗服务器资源来损害系统/应用程序/数据库的其余部分。
锁定信息几乎同样重要 -> 对单个记录进行 PK 查找的微小查询可能会由于锁定和阻塞而出现错误的计时。我在某处读到,这个网站在其早期的测试阶段就被死锁所困扰。 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 获取查询和时间,以及查询分析器中的执行路径以查看瓶颈所在。
【讨论】:
您可以使用System.Diagnostics.Stopwatch,它可以让您跟踪查询执行的时间。请记住,在您枚举它们之前,不会执行 Linq->SQL 查询。另请注意,如果您登录到 Console.Out,则会对性能造成重大影响。
【讨论】:
您可以做的是向 DataContext.Log 添加一个自定义 TextWriter 实现,它将生成的 sql 写入文件或内存。然后遍历这些查询,使用原始 ADO.NET 代码执行它们,并用秒表包围每个查询。
我以前使用过类似的技术,因为似乎每当我开发一些代码时,我从来没有打开 Profiler,而且很容易将这些结果输出到 HTML 页面。确保您在每个网站请求中执行两次,但尽快查看执行时间而不是等到您在 Profiler 中捕获某些内容时会很有帮助。
此外,如果您使用 SQL 工具路线,我建议您使用谷歌搜索“最慢查询 DMV”并获取一个存储过程,该过程可以为您提供数据库中最慢查询的统计信息。滚动探查器结果以查找错误查询并不总是那么容易。此外,通过对 sql 2005 的 dmv 进行正确查询,您还可以通过 cpu vs. time 等进行排序。
【讨论】:
我们使用 SQL Profiler 通过 LLBLGen Pro 测试我们的查询。
【讨论】:
最好的办法是将查询记录到一个文件中,然后他们使用 SQL Profiler 对其进行计时并调整查询的索引。
【讨论】: