如果是8i以后的oracle版本(oracle815以后的版本),则可以通过建立BFI(based function index)来达到既要用函数,又需要使用索引得需求。 上面的like字句会使用索引,如果改成 like '%S',这样就不会使用index了。至于lower和trim,他们是不走索引的,因为index中存储的是rowid和key(键值,如你的add_name值),并没有存储经过函数运算的key值,因此导致了一个FULL TABLE SCAN,从而在多数情况下极大的损失了性能。
我建了BFI如下 CREATE INDEX HM_BFI_IND_L_NAME ON INDIVIDUAL ( lower(rtrim(ind_last_name)) ); 可察看执行Plan,仍然是Full table scan,难道是我目前的Oracle版本不支持,但是检索引时,它提示: Index Created 还需要有什么设置吗? 谢谢
hi : UChuaihuai(huaihuai) 如果你要用BFI,记得要把query_rewrite_enable参数设为TRUE, ALTER SET SYSTEM query_rewrite_enable=TRUE 然后你在执行plan看看, 而我在pl/sql下看 用 rull,和choose时仍然是rall table scan,但是用 first row ,和all row 下提示可以用到索引,至于为基于rull时不能用, 以及如何在脚本中选择索引的方式,还有其他涉及的方面,还不了解, 共同学习。。呵呵 ——————————————------- QQ: 6587168 希望能多交些这里的朋友;
上面的like字句会使用索引,如果改成 like '%S',这样就不会使用index了。至于lower和trim,他们是不走索引的,因为index中存储的是rowid和key(键值,如你的add_name值),并没有存储经过函数运算的key值,因此导致了一个FULL TABLE SCAN,从而在多数情况下极大的损失了性能。
CREATE INDEX HM_BFI_IND_L_NAME ON INDIVIDUAL
(
lower(rtrim(ind_last_name))
);
可察看执行Plan,仍然是Full table scan,难道是我目前的Oracle版本不支持,但是检索引时,它提示:
Index Created
还需要有什么设置吗?
谢谢
UChuaihuai(huaihuai) 如果你要用BFI,记得要把query_rewrite_enable参数设为TRUE, ALTER SET SYSTEM query_rewrite_enable=TRUE
然后你在执行plan看看,
而我在pl/sql下看 用 rull,和choose时仍然是rall table scan,但是用 first row ,和all row 下提示可以用到索引,至于为基于rull时不能用,
以及如何在脚本中选择索引的方式,还有其他涉及的方面,还不了解,
共同学习。。呵呵
——————————————-------
QQ: 6587168 希望能多交些这里的朋友;