在他的一个blog articles中,这个网站的所有者向读者提出了这个问题:“你自动测量流经你软件的所有查询,对吗?”
你是怎么做到的?对数据库进行查询的每行代码后跟一行代码递增计数器?或者,您的应用程序和数据库之间是否有工具可以为您执行此操作?
答案 0 :(得分:3)
SQL Server Profiler是我的首选工具,但显然只适用于DB端。
应该注意,这是为了优化查询和性能以及调试。这不是一直保持运行的工具,因为它可能是资源密集型的。
答案 1 :(得分:1)
我不知道Jeff究竟想说什么,但我猜他希望你能使用你的数据库中的任何查询性能监控工具。
另一种方法是在代码中使用数据库连接的包装器。例如,在Java中,假设您拥有所有类都使用的DataSource,您可以编写自己的DataSource实现,该实现使用基础DataSource来创建Connection对象。您的DataSource应该将这些连接包装在您自己的Connection对象中,这些对象可以跟踪流过它们的数据。
答案 2 :(得分:1)
我有一个C ++包装器,用于我的所有数据库工作。该包装器(在调试模式下)基本上在它运行的每个语句上执行EXPLAIN QUERY PLAN。如果它返回没有使用索引的响应,则为ASSERTS。确保使用索引的好方法(但仅限于调试模式)
答案 3 :(得分:1)
我们刚刚购买了一款名为dynaTrace的软件产品。它使用字节码检测(在我们的例子中使用MSIL,因为我们使用.Net但它也使用Java)来执行此操作。它基本上围绕我们选择的方法和各种框架方法,以捕获每个方法执行所需的时间。
关于数据库调用,它跟踪每个调用(通过ADO.Net)和调用中的参数以及执行时间。然后,您可以从数据库调用开始,然后遍历程序执行的执行路径。它将在路径中显示每个方法调用(您已经检测过)。这真是太糟糕了。
您可以通过多种不同的方式使用它,但通常这将用于某种负载测试场景,其他一些产品通过系统的各种路径提供负载。然后,您将获得负载下的数据库调用列表,并可以查看它们。
你不仅可以评估一个电话的执行情况,还可以评估它们的数量,以防止一千次减少死亡。
答案 4 :(得分:0)
对于Perl,DBI::Profile。
答案 5 :(得分:0)
如果您的架构设计得很好,拦截所有数据访问调用并测量查询执行时间应该相当容易。一个相当简单的方法是使用围绕数据库调用的方面(如果您的语言/框架支持方面编程)。另一种方法是使用一个拦截所有调用的特殊驱动程序,重定向到一个真实的驱动程序并测量执行查询时间。