1

在他的一篇博客文章中,该网站的所有者向读者提出了这个问题,“您正在自动测量流经您的软件的所有查询,对吗?”

你怎么做到这一点?对数据库进行查询的每一行代码后面都有一行代码递增一个计数器?或者,是否有位于您的应用程序和数据库之间并为您执行此操作的工具?

4

6 回答 6

3

SQL Server Profiler是我选择的工具,但显然只用于 DB 端。

需要注意的是,这是为了优化查询和性能,以及调试。这不是一个一直运行的工具,因为它可能是资源密集型的。

于 2008-10-03T20:22:50.327 回答
1

我们刚刚购买了一款名为 dynaTrace 的软件产品来执行此操作。它使用字节码检测(在我们的例子中是 MSIL,因为我们使用 .Net,但它也使用 Java)来做到这一点。它基本上围绕我们选择的方法和各种框架方法进行检测,以捕获每个方法执行所需的时间。

关于数据库调用,它跟踪每个调用(通过 ADO.Net)和调用中的参数,以及执行时间。然后,您可以从 DB 调用中走出来,并通过程序到达那里的执行路径。它将显示路径中的每个方法调用(您已检测)。这是非常糟糕的。

您可能会以多种不同的方式使用它,但通常这将用于某种负载测试场景,而其他一些产品通过系统的各种路径提供负载。然后你会得到一个负载下的数据库调用列表,并可以查看它们。

您不仅可以评估一个调用的执行情况,还可以评估它们的数量,以防止一千次削减的死亡。

于 2008-10-10T14:33:45.663 回答
1

我不知道 Jeff 到底想说什么,但我猜他希望您使用您为数据库提供的任何查询性能监控工具。

另一种方法是在代码中为数据库连接使用包装器。例如,在 Java 中,假设您有一个所有类都使用的 DataSource,您可以编写自己的 DataSource 实现,该实现使用底层 DataSource 创建 Connection 对象。您的 DataSource 应该将这些连接包装在您自己的 Connection 对象中,该对象可以跟踪流经它们的数据。

于 2008-10-03T20:26:44.390 回答
1

我有一个用于所有数据库工作的 C++ 包装器。该包装器(在调试模式下)基本上对它运行的每条语句都执行 EXPLAIN QUERY PLAN。如果它得到一个索引没有被使用的响应,它就会断言。确保使用索引的好方法(但仅适用于调试模式)

于 2008-10-03T20:29:02.433 回答
0

如果您的架构设计良好,那么拦截所有数据访问调用并测量查询执行时间应该相当容易。一个相当简单的方法是使用围绕 DB 调用的方面(如果您的语言/框架支持方面编程)。另一种方法是使用拦截所有调用的特殊驱动程序,重定向到真正的驱动程序并测量查询执行时间。

于 2008-10-05T00:10:11.957 回答
0

对于 Perl,DBI::Profile

于 2008-10-03T20:26:10.833 回答