oracle 常用的 hint

gather_plan_statistics

select /*+ gather_plan_statistics  */
  from tmp_t0 a,
       tmp_t1 b
 where 1=1
   and a.id=b.id
;

ordered

select /*+ ordered  */
  from tmp_t0 a,
       tmp_t1 b
 where 1=1
   and a.id=b.id
;

no_merge
视图合并后大概率会打乱视图/子查询中标的原本连接顺序。
通常都是需要禁止试图合并。

select/*+ no_merge(c)*/ 
          d.id
  from ( select a.id
           from tmp_t0 a
                tmp_t1 b
          where 1=1
            and a.id=b.id
         ) c
         tmp_t2 d
where 1=1
  and c.id=d.id
;
  

use_hash
swap_join_inputs

select /*+ use_hash(a,b) swap_join_inputs(a) */
  from tmp_t0 a,
       tmp_t1 b
 where 1=1
   and a.id=b.id
;

use_nl
leading

select /*+ use_nl(a,b) leading(a) */
  from tmp_t0 a,
       tmp_t1 b
 where 1=1
   and a.id=b.id
;

半连接调整为嵌套循环

select /*+ use_nl(tmp_t1@t1,a) leading(a) */
  from tmp_t0 a
 where 1=1
   and a.id in (
       select/*+ qb_name(t1) */ b.id
         from tmp_t1 b 
)
;

no_unnest
no_unnest 是为了执行计划产生 filter。
filter 文档说可以理解为优化后的nl,但实际中出现filter时往往存在性能问题,需要消除filter。

select a.id
  from tmp_t0 a
 where 1=1
   and a.id in (
       select/*+ no_unnest */ b.id
         from tmp_t1 b 
)
;

unnest
unnest 是为了消除filter。

select a.id
  from tmp_t0 a
 where 1=1
   and exists (
       select/*+ unnest */ 1
         from tmp_t1 b
        where 1=1
          and a.id=b.id 
)
;

parallel
建议parallel的值不要设置的太大。

select /*+ parallel(a 8)  */
  from tmp_t0 a,
       tmp_t1 b
 where 1=1
   and a.id=b.id
;

full

select /*+ full(a)  */
  from tmp_t0 a,
       tmp_t1 b
 where 1=1
   and a.id=b.id
;

push_pred
谓词推入 ,当SQL语句中包含不能合并的视图,同时视图有谓词过滤,CBO会将谓词过滤条件推入视图中。其目的就是让oracle尽早可能地过滤掉无用的数据,从而提升查询性能。
谓词推入的前提是要有不能合并的视图。

create view v_tmp_t0_data
as
select * from tmp_t0
union all
select * from tmp_t0
;

select/*+ push_pred(a)*/
         *
  from v_tmp_t0_data a,
       tmp_t1 b
 where 1=1
   and a.id= b.id
   and b.id=2
;
 

禁止谓词推入

alter session set "_push_join_predicate"=false;

参考:

你可能感兴趣的:(hint,#,oracle,optimizer,statistics)