检测数据库访问
Jeff在其中一个播客中提到,他经常做的一件事是放入数据库调用的工具中,以便他可以知道是什么查询导致了缓慢性等。这是我过去使用SQL Profiler进行过测量,我对其他人用来将其作为应用程序一部分的策略感兴趣。
是否只是在每个数据库调用中都包含一个计时器并记录结果的一种简单情况,还是有一种"更简洁"的方式呢?也许已经有一个框架为我们执行此操作,或者是否存在我可以在其中启用的标志Linq-to-SQL将提供类似的功能。
我主要使用cbut,但也对查看来自不同语言的方法感兴趣,并且我对通过SQL Profiler之类的db平台方法执行此操作的"代码"方式更感兴趣。
解决方案
回答
如果查询多于一个表上的简单SELECT,那么如果我使用的是MySQL或者PostgreSQL,我总是通过EXPLAIN运行它。如果我们使用的是SQL Server,则Management Studio的显示估算执行计划基本上是相同的。查看引擎如何访问每个表以及它将使用哪些索引是很有用的。有时它会让我们感到惊讶。
回答
如果我们正在SQL Management Studio中编写查询,则可以输入:SET STATISTICS TIME ON,SQl Server会告诉我们查询的各个部分解析,编译和执行所花费的时间。
我们可以通过处理SqlConnection类的InfoMessage事件来记录此信息(但我认为使用SQL事件探查器要容易得多。)
回答
记录数据库调用,总时间和应用程序中返回的记录数(字节)很有用,但是并不能提供我们所需的所有信息。
它可能会向我们显示出我们所不期望的使用模式。它可能显示我们使用"逐行"访问而不是"基于集"操作的位置。
最好使用的工具是SQL Profiler,并分析"读取"数与CPU和持续时间的关系。我们想避免高CPU查询,高读取次数和长持续时间(duh!)。
"按阅读分组"是将最讨厌的查询放在首位的有用功能。
回答
我本以为要问的重要问题是"我们使用的是什么数据库平台?"
例如,在Sybase中,安装MDA表可能会解决问题,它们提供了从过程调用使用到平均逻辑I / O,CPU时间和索引覆盖范围的大量统计信息。它可以像我们想要的那样聪明。
回答
我肯定会在应用程序运行时看到使用SQL Profiler的价值,并且EXPLAIN或者SET STATISTICS会为我们提供有关单个查询的信息,但是是否有人例行地将测量点放入其代码中以收集有关正在进行的数据库查询的信息,这些信息可能会被选中例如,对表的查询最初执行得很好,但是随着行数的增加,查询变得越来越慢。
如果我们使用的是MySQL或者Postgre,则可以使用各种工具实时查看查询活动,但是我找不到像SQL Profiler那样好的工具来衡量一段时间内的查询性能。
我想知道是否(或者应该有?)某种类似于ELMAH的方式,即插即用,无需过多努力即可为我们提供信息?
回答
如果我们喜欢Firebird,则可能要看sinatica.com。
我们即将推出适用于Firebird DBA的实时监视工具。
</无耻的插头>
回答
如果我们使用Hibernate(我使用Java版本,我会想象NHibernate有类似的东西),则可以让Hibernate收集有关许多不同事物的统计信息。参见,例如:
http://www.javalobby.org/java/forums/t19807.html