SQL执行计划固化问题

  • A+
所属分类:数据库

客户一条访问上千万记录的语句,因为统计信息的变动导致全表扫描访问,引起严重的主机性能问题,这个问题一方面通过更精确的统计信息更新,并且让语句首次执行时选择正确的执行计划;另一方面最好是能够固化执行计划,避免下次再发生意外。

这是oracle 9i的数据库,固化需要使用outline,虽然是淘汰的技术,但是特殊的运行环境还是需要,搜了一下相关资料,在测试环境中验证一下。

SQL执行计划固化问题

SQL执行计划固化问题

1、首先要激活使用outline

alter system set use_stored_outlines=true

SQL执行计划固化问题

2、基于目标语句创建一个outline

事先需要把create any outline权限赋给目标用户):

create or replace outline outline_emp01 on select count(*) from emp where empno=7300;

下面是原有的执行计划:

SQL执行计划固化问题

SQL执行计划固化问题

3、基于正确执行计划再创建一个outline

create or replace outline outline_emp02 on select /*+ full(emp) */ count(*) from emp where empno=7300;

SQL执行计划固化问题

4、下面把这两个outline所使用的hint做一个交换

SQL执行计划固化问题

用sys用户执行:

SQL执行计划固化问题

SQL执行计划固化问题

5、再看执行计划

发现已经是基于全表扫描了(实际环境是反过来,固定为走索引):

SQL> explain plan for select count(*) from emp where empno=7300;

SQL> select * from table(dbms_xplan.display);

SQL执行计划固化问题

下面语句可以查看outline的相关信息(outln用户或者sys用户身份执行):

SQL执行计划固化问题

作者,慕容荃

银信科技AIX/Oracle/TSM/Informix方面的资深技术专家。年少轻狂时致力于成为走过的每一个领域的专家;随着岁月老去,更看重在分享中寻获的快乐,从早年的aixchina.com到现在的银信微讲堂,一直在路上。工作之余,喜欢打牌,看电影,看科幻小说,也不排斥跑步打球出一身汗。

avatar

发表评论

您必须才能发表评论!