Oracle对in的处理

Oracle对in的处理有以下四种方式
1.in_list iterator
in_list iterator是针对in的值是常量集合的一种处理方法。此时优化器会遍历目标sql中in内的所有值,然后做比较,看目标结果集是否有符合条件的记录,直到结束。
in_list iterator是针对in的值是常量集合的首选方法,通常这种方式要比in_list expansion效率高。
in_list iterator 处理in的前提是in所在的列上一定要有索引。
Oracle没有相关的hint让目标sql走in_list iterator,但是可以通过10142,10157事件来禁用in_list iterator。
禁用in_list iterator
alter session set event ‘10142 trace name context forever’;
alter session set event ‘10157 trace name context forever’;
in_list iterator
create index idx_emp_empno on emp(empno);
select * from emp where empno in (1,2,3);
2.in_list expansion /or expamsion
in_list expansion也是针对in的值是常量集合的一种处理方法,它会把in的值拆分成union all集合,对各个值单独做处理,最后在union all的操作。但是Oracle 会优先使用in_list iterator。
使用10142,10157禁用in_list iterator,以便让Oracle走出in_list expansion
alter session set event’ 10142 trace name context forever’;
alter session set event ‘10157 trace name context forever’;
select /+use_concat/ * from emp where empno in (1,2,3);
select /+no_expend/ from emp where empno in (1,2,3);
强制使用in_list expansion的hint use_concat/no_expend

3.in_list filter
in_list filter 是针对in后面是子查询的一种处理方法,优化器会把in后的子查询的结果集作为过滤条件,并走filter类型的执行计划。
in_list filter需要满足两个条件
1.in后面是子查询而不是常量
2.Oracle未对子查询做展开操作
select id,value from emp where empno in (select /+no_unset/ empno from dept)
4.对in子查询做子查询展开/视图合并操作
满足两个条件:in后面是子查询,对子查询做展开或者视图合并操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值