模糊查找的索引在什么情况下有效?

时间:2021-10-16 20:53:42
select * from emp where ename like '%zhang%' 
select * from emp where ename like 'zhang%'
select * from emp where ename like '%zhang'

这三条sql查询那一条索引有效,高手解释下,在线等回复!!

7 个解决方案

#1


一般来讲是第2条会走索引,但是通配符放在后面也不一定就能走索引,因为这时对索引是一个范围扫描,如果oracle通过统计数据认为这个范围比较大,那么走索引得到的代价评估值就更大,这时就不会选择走索引。

如果通配符放在前面,oracle几乎可以肯定是不会选择走索引的(除非oracle确定该sql只需要访问该索引而不需要访问表)。因为这时必须是索引全扫描,而全扫描索引本身就会消耗大量资源,然后再根据得出的rowid(很有可能也很多)去扫描表又要消耗大量资源,这个查询总共消耗的资源很可能会比直接扫描全表慢很多。

如果你认为自己比oracle更了解自己的查询语句和数据分布情况,你确定更多情况走索引是正确的,那就使用hint强制要求走索引。

#2


如果对ename列建立索引,则都有效的,索引有无效,并不是根据你列值的取法,而是依据你取的列,只是查询效率上的区别而已

#3


楼上的两位谢谢,ename 是索引列 根据两位的回答 又让我模糊了

#4


不知道是不是这个意思。常理说是2可能走索引。但具体走不走还要通过oracle进行日志计划的比较决定。因为并不是所有情况下用索引比不用索引快。

#5


可以去dbfaq.net试试

#6


引用 5 楼  的回复:
可以去dbfaq.net试试


dbfaq.net是什么东西

#7


第二条有效,其他均无效

#1


一般来讲是第2条会走索引,但是通配符放在后面也不一定就能走索引,因为这时对索引是一个范围扫描,如果oracle通过统计数据认为这个范围比较大,那么走索引得到的代价评估值就更大,这时就不会选择走索引。

如果通配符放在前面,oracle几乎可以肯定是不会选择走索引的(除非oracle确定该sql只需要访问该索引而不需要访问表)。因为这时必须是索引全扫描,而全扫描索引本身就会消耗大量资源,然后再根据得出的rowid(很有可能也很多)去扫描表又要消耗大量资源,这个查询总共消耗的资源很可能会比直接扫描全表慢很多。

如果你认为自己比oracle更了解自己的查询语句和数据分布情况,你确定更多情况走索引是正确的,那就使用hint强制要求走索引。

#2


如果对ename列建立索引,则都有效的,索引有无效,并不是根据你列值的取法,而是依据你取的列,只是查询效率上的区别而已

#3


楼上的两位谢谢,ename 是索引列 根据两位的回答 又让我模糊了

#4


不知道是不是这个意思。常理说是2可能走索引。但具体走不走还要通过oracle进行日志计划的比较决定。因为并不是所有情况下用索引比不用索引快。

#5


可以去dbfaq.net试试

#6


引用 5 楼  的回复:
可以去dbfaq.net试试


dbfaq.net是什么东西

#7


第二条有效,其他均无效