6

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

4

6 回答 6

9

正如两个人已经说过的,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

于 2008-09-17T03:29:17.263 回答
5

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

于 2008-09-17T03:33:17.863 回答
2

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

于 2008-09-16T19:56:05.793 回答
1

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

I've used a similar technique before because it seemed whenever I was developing some code I never had Profiler open, and it was really easy to output those results to a HTML page. Sure your executing them twice per website request, but its helpful to see execution times asap instead of waiting until you catch something in Profiler.

Also if your going to the SQL Tool route I would recommend googling "slowest query DMV" and getting a stored procedure that can give you stats on the slowest queries in your db. Its not always easy to scroll through profiler results to find the bad queries. Also with the right queries over sql 2005's dmv you can also do ordering by lets say cpu vs. time and so forth.

于 2009-01-16T19:33:28.323 回答
0

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

于 2008-09-16T19:53:27.967 回答
0

最好的办法是将查询记录到文件中,然后他们使用 SQL Profiler 对其进行计时并调整查询的索引。

于 2008-09-16T19:59:56.923 回答