检测数据库访问

时间:2008-08-12 12:01:02

标签: database logging instrumentation

杰夫在其中一个播客中提到,他总是做的一件事就是放入数据库调用的工具中,以便他可以判断哪些查询导致缓慢等等。这是我过去用SQL测量过的东西Profiler,但我对其他人习惯将此作为应用程序的一部分的策略感兴趣。

是否只是在每个数据库调用中包含一个计时器并记录结果的情况,还是有一种“整洁”的方式呢?也许有一个框架可以为你做这个,或者是否有一个我可以启用的标志,例如Linq-to-SQL将提供类似的功能。

我主要使用c#,但也有兴趣看到来自不同语言的方法,并且我对通过SQL Profiler等数据库平台方法执行此操作的“代码”方式更感兴趣。

7 个答案:

答案 0 :(得分:1)

如果查询不仅仅是单个表上的一个简单SELECT,我总是通过EXPLAIN运行它,如果我在MySQL或PostgreSQL上。如果您使用的是SQL Server,那么Management Studio的显示估计执行计划基本相同。查看引擎如何访问每个表以及它将使用哪些索引很有用。有时会让你大吃一惊。

答案 1 :(得分:1)

记录数据库调用,总时间和应用程序中返回的记录数(字节数)很有用,但它不会为您提供所需的所有信息。

它可能会显示您没有预料到的使用模式。它可能会显示您使用“逐行”访问而不是“基于集合”操作的位置。

使用的最佳工具是SQL事件探查器,并分析“读取”与CPU和持续时间的数量。您希望避免高CPU查询,高读取和长持续时间(呃!)。

“按读取分组”是一个有用的功能,可以将最糟糕的查询带到最顶层。

答案 2 :(得分:0)

如果您在SQL Management Studio中编写查询,则可以输入:SET STATISTICS TIME ON,SQl Server将告诉您查询的各个部分需要多长时间才能解析,编译和执行。 您可以通过处理SqlConnection类的InfoMessage事件来记录此信息(但我认为使用SQL事件探查器要容易得多。)

答案 3 :(得分:0)

我想在这里要问的重要事情是“你使用的是什么数据库平台?”

例如,在Sybase中,安装MDA tables可能会解决您的问题,它们提供了从过程调用使用到平均逻辑I / O,CPU时间和索引覆盖率的一大堆统计信息。它可以像你想要的一样聪明。

答案 4 :(得分:0)

我确实看到了在应用程序运行时使用SQL事件探查器的价值,并且EXPLAIN或SET STATISTICS将为您提供有关各个查询的信息,但是是否有人会定期将测量点放入其代码中以收集有关正在进行的数据库查询的信息 - 例如,对于最初表现良好的表的查询,但随着行数的增长,变得越来越慢。

如果您正在使用MySQL或Postgre,那么可以使用各种工具实时查看查询活动,但我没有找到与SQL Profiler一样好的工具来测量查询性能。

我想知道是否存在(或者应该是)类似于ELMAH的东西,只是插入它并为您提供信息而无需额外的努力?

答案 5 :(得分:0)

如果您进入Firebird,您可能需要观看sinatica.com 我们很快就会为Firebird DBA启动一个实时监控工具。

< /无耻插头>

答案 6 :(得分:0)

如果你使用Hibernate(我使用Java版本,我认为NHibernate有类似的东西),你可以让Hibernate收集有关很多不同东西的统计数据。例如,见:

http://www.javalobby.org/java/forums/t19807.html