Oracle LEFT JOIN ON VS WHERE

在Oracle 11.2.0.4.0中,视图中的LEFT JOIN ON导致查询性能低下,即使使用索引提示(HINT)也无效。解决办法是将LEFT JOIN转换为使用WHERE子句配合(+), 使查询优化器能更好地利用索引。注意,此方法仅适用于单个LEFT JOIN,因为Oracle 11g不支持一张表LEFT JOIN多个表,但在12C中已支持。" 132480934,8753399,JavaScript实现Hardy-Ramanujan定理算法,"['javascript', '算法', '开发语言']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Version   11.2.0.4.0 - 64bit 

最近遇到视图查询特别的慢,排查发现有好几张表没有走索引, 很明显走索引是最好的选择方案。我尝试用Hint 强制视图走索引,但是hint无效。

视图 里强制走索引的hint

/*+ INDEX(视图别名.表别名  索引名)*/

create view v_test as select * from test t, test3 t3 where t.id=t3.id;

select /*+ INDEX( v.t   index1)*/ from v_test v ,test2 where v.id=test2.id;

我的遇到的例子是视图使用的 LEFT JOIN ON 不是 WHERE, 强制索引更本没用。 由于视图里面包含inner jon and LEFT join, 所以我将视图修改为 WHERE,遇到LEFT JOIN就修改为(+)

使用修改后的视图在连接其他表的时候就会optimizer会自动走所以。

结论: 当查询语句中涉及视图并且执行计划不正确的时候可以考虑将视图的标准化LEFT JOIN 改成WHERE (+) 的方式, 避免多层嵌套

 

注意的是ORACLE11g 不支持一张表left join多个表, 但是12C中是可以的。 ORA-01417: a table may be outer joined to at most one other table

如下语句在11g 会报错 

 select *
      from test1, test2, test3
     where  test1.c_number=test2.c_number
     AND test1.id = test3.dept_id(+)
  AND test2.id 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值