使用 Linq to SQL 时有没有好的方法来计时 SQL 查询?我真的很喜欢日志记录功能,但如果您也能以某种方式对查询进行计时,那就太好了。有任何想法吗?

有帮助吗?

解决方案

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

其他提示

正如两个人已经说过的,SQL Profiler 是用于此目的的现成工具。我不想成为一个回声,但我想更详细地阐述一下:它不仅提供来自 SQL Server 的实际计时(而不是来自应用程序端的计时,其中网络 I/O、连接和连接池计时被添加到蛋糕中),而且还为您提供[通常更重要] /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

你可以使用 System.Diagnostics.Stopwatch 它将允许您跟踪查询执行的时间。请记住,在枚举 Linq->SQL 查询之前,它们不会被执行。另请注意,如果您正在登录 Console.Out 性能将会受到重大影响。

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

我以前使用过类似的技术,因为似乎每当我开发一些代码时我都从未打开过 Profiler,而且将这些结果输出到 HTML 页面真的很容易。当然,每个网站请求都会执行两次,但是尽快查看执行时间而不是等到在 Profiler 中捕获某些内容会很有帮助。

另外,如果您要使用 SQL 工具路线,我建议您在谷歌上搜索“最慢查询 DMV”并获取一个存储过程,该存储过程可以为您提供数据库中最慢查询的统计信息。滚动浏览分析器结果以找到错误查询并不总是那么容易。另外,通过对 sql 2005 的 dmv 进行正确的查询,您还可以通过 cpu 与 cpu 进行排序。时间等等。

我们使用 SQL Profiler 来测试 LLBLGen Pro 的查询。

最好的方法是将查询记录到文件中,然后使用 SQL Profiler 来计时并调整查询的索引。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top