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