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