我想在Oracle数据库中的查询方面寻求一些帮助。
我有大量的选择,多个表连接在一起(超过10个)和多个where子句应用(10-20)。有些表有10列,有些表有300+。大多数表都有10+百万行,其中一些甚至有60+百万行。
执行时间通常在25到45分钟之间,有时下降到30秒。监视服务器负载显示,负载几乎相同。
我们希望优化选择,将通常的执行时间减少到10-15分钟或更少。
我的问题是:是否有任何工具或技术可以为我提供查询运行时间这么长的信息(比如某种东西,它可以告诉我在最后一次执行查询时,第一次连接占用了36秒,第二次连接占用了40秒,第1次执行了10秒等等)?
(请注意,我要求的不是优化建议,而是任何工具或技术,这些工具或技术可以为我提供关于执行查询的哪一部分/操作花了这么长时间的信息)
谢谢,我希望我说得很清楚!)
发布于 2017-03-07 15:55:17
一种选择是执行以下操作:
/*+ gather_plan_statistics */添加到查询中select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));这为您提供了一个包含实际行、实际时间、内存使用情况等列的计划。
如果不想重新运行查询,可以使用如下SQL Monitor报告生成上次执行的实际行和次数:
select dbms_sqltune.report_sql_monitor(sql_id => ' add the sql_id here') from dual;使用这些工具可以让您专注于相关操作。简单的旧解释计划对于复杂的查询来说是不够好的。AWR不关注单个查询。当有更快的替代方案时,追踪是对时间的巨大浪费。
https://stackoverflow.com/questions/42651943
复制相似问题