同时使用Oracle CBO和Oracle提示会产生什么效果

  • 本文关键字:Oracle 提示 CBO oracle
  • 更新时间 :
  • 英文 :


Oracle数据库11g版。

我用FIRST_ROWS_10设置了Oracle CBO参数OPTIMIZER_MODE。如果我在SQL中使用提示ALL_ROWS,什么会影响FIRST_ROWS_10或ALL_ROWS。并且所有的sql是否会影响FIRST_ROWS_10,或者取决于Oracle数据库将自动选择使用FIRST_ROWS_10或all_ROWS的情况。

语句提示覆盖会话设置,会话设置覆盖实例参数。理解这个优先顺序很重要,因为你想尽可能具体地解决问题。如果您只在一个会话或一条语句中遇到问题,请不要更改整个数据库的OPTIMIZER_MODE。否则,你可能会制造比解决更多的问题。

您可以通过运行以下命令的不同组合来测试优先级:

alter system set optimizer_mode=first_rows_10;
alter session set optimizer_mode=first_rows_10;
select /*+ first_rows_10 */ * from dual;
alter system set optimizer_mode=all_rows;
alter session set optimizer_mode=all_rows;
select /*+ all_rows */ * from dual;

然后比较这些语句的执行计划,并特别注意";大纲数据";区段:

explain plan for select * from dual;
select * from table(dbms_xplan.display(format => '+outline'));
explain plan for select /*+ all_rows */ * from dual;
select * from table(dbms_xplan.display(format => '+outline'));
explain plan for select /*+ first_rows(10) */ * from dual;
select * from table(dbms_xplan.display(format => '+outline'));

最新更新