SQL计划更改原因

问题描述 投票:2回答:1

[一个作业调度程序每天在生产环境中运行,过去的执行历史只需要20分钟,但是今天已经有2多个小时没有完成。

a)如何检查SQL计划是否今天已更改?

b)计划更改的原因可能是什么?我知道由于代码更改。还有什么可能导致计划变更?

oracle database-performance database-administration sqlperformance sql-tuning
1个回答
0
投票
select sql_id, sql_text from gv$sql where lower(sql_fulltext) like '%some unique string%';

使用SQL_ID,您可以开始调查历史信息。表DBA_HIST_SQLSTAT包含许多有关SQL的摘要信息。最重要的列是PLAN_HASH_VALUE;如果该值更改,则执行计划已更改。

select snap_id, sql_id, plan_hash_value, executions_delta, elapsed_time_delta/100000 seconds_delta
    ,dba_hist_sqlstat.*
from dba_hist_sqlstat
--join to dba_hist_snapshot if you want to find precise times instead of SNAP_IDs.
where sql_id = '&SQL_ID'
order by dba_hist_sqlstat.snap_id;

如果计划已更改,您可以通过以下方式查看两个计划:

select * from table(dbms_xplan.display_awr(sql_id => '&SQL_ID'));

不幸的是,使用Oracle查询调优最困难的部分是有十二种不同的方式来查看执行计划,并且每种方式都提供略有不同的数据。

此查询仅返回上次执行的数字,但返回实际的数字和时间,这有助于您专注于特定操作并等待导致问题的事件。

select dbms_sqltune.report_sql_monitor(sql_id => '&SQL_ID', type => 'text') from dual;

此查询返回一些其他执行计划信息,特别是Note部分。大多数图形IDE都忽略了这一部分,但是对于复杂的故障排除来说至关重要。如果发生了一些奇怪的事情,Note部分将经常解释原因。

select * from table(dbms_xplan.display_cursor(sql_id => '&SQL_ID'));

许多个执行计划可以更改的原因。如果您向问题添加其他信息,我也许可以做出有根据的猜测。
© www.soinside.com 2019 - 2024. All rights reserved.