如何在Oracle中记录慢速查询

时间:2010-10-21 11:59:56

标签: performance oracle10g

我必须记录慢查询,让我们说运行时间超过3毫秒的查询 应该记录下来 大多数情况下,这些查询都是SELECT 如何在Oracle中记录它们?

3 个答案:

答案 0 :(得分:2)

如果您正在使用AWR,那么将从ASH记录,您只需要使用OEM或手写SQL来挖掘它。

实际上,3ms非常快,在现代硬件上Oracle的响应时间为5-20ms,所有事情都考虑在内。

答案 1 :(得分:1)

在应用程序代码中,您可以执行以下操作:

v_start_time := dbms_utility.get_time();
-- Your query here
-- ...
v_end_time := dbms_utility.get_time();
if v_end_time - v_start_time > v_max_time then
   insert into log_table ...;
end if;

dbms_utility.get_time以1/100秒为单位返回时间 - 因此您无法以3ms的精度使用它。您也许可以使用SYSTIMESTAMP。

实际上,我不会记录任何花费不到半秒的查询,你几乎可以记录所有内容。

答案 2 :(得分:1)

如果你想记录慢查询,那么Tony给出的解决方案是好的。 但是,如果您无法修改应用程序的源代码,则可以考虑安装sql间谍。我从来没有这样做但可以轻松完成。请注意,它会降低您的应用程序速度:如果您正在对生产服务器进行故障排除,那么这不是一个好的解决方案。

恕我直言,最好的解决方案不是记录慢查询而是找到它们(差别很微妙...... :))。 Oracle提供了大量工具来查找此类信息:

  • AWR报告是我的首选工具。你会发现一个名为“由Elapsed Time命令的SQL”的段落,这是你正在看的基本内容
  • gridcontrol也给你这个信息,但我不太了解这个工具。它比AWR报告更简单
  • 如果您无法访问其中一个工具,可以尝试简单地启动此其他stackoverflow帖子中给出的SQL: Top 5 time-consuming SQL queries in Oracle