利用DDL改变执行计划

来源:互联网 发布:北京海量数据 股东 编辑:程序博客网 时间:2024/06/05 14:15

系统和数据变更在凌晨4点升级完成,测试时发现应用中有一条SQL执行异常缓慢。

手工执行SQL后,利用select * from table(dbms_xplan.display)查看执行计划。
发现执行计划和升级前并没有区别。

怀疑是统计信息有问题,跟开发人员沟通了一下。发现有几张表插入了一批数据。

收集统计信息后,重新执行SQL发现执行计划有了改变。
EXEC dbms_stats.gather_table_stats('&owner','&tablename',cascade => TRUE);

但系统上SQL的执行计划依然没有改变,系统依然缓慢。

怎么让系统上的SQL重新解析,使用新的执行计划呢?

1、重启数据库,
2、刷新共享池。
3、重新分析SQL引用的表和索引。
4、在SQL引用的对象(表、视图等)上执行DDL操作。
5、对SQL引用的对象进行了权限更改
6、修改SQL
7、使用outline

生产环境重启数据库,刷新共享池,修改权限风险太大。修改SQL,使用OUTLINE时间太紧.
综合考虑以上几种方法,决定在SQL引用的对象上执行DDL操作,即添加在表的列上添加一个注释。
alter table test_SUPPLIER modify SUPPLIER_NAME default SUPPLIER NAME;

由于在SQL引用的对象上执行了DDL操作,会导致SQL重新解析。
重新执行系统中的查询发现能很快返回结果。
Select * from table(dbms_xplan.display_cursor('95n1023ybm3u8',0)); 
查看执行计划后,发现执行计划也已经改变。