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;
参考: