Notes on ‘Expert Oracle’ — No.11.4: 索引 — Tips

1.B* 索引不会为 全null 值建立索引条目

   所以 select * from T where x is null 不会使用索引 (如果索引建在x字段上)

   不过, 如果满足以下两个条件, 仍会用到索引

       a. 索引建在 (x,y) 上

       b. y 被定义为Not Null字段

2. 外键上要不要索引?

   a.一般来说都要,否则的话

     i.如果修改父表的主键值或者删除父表中一行记录,会导致整个子表被锁

    ii.父表中的On Delete Cascade被触发时 也会导致全表扫描

   iii.按父表中的值查询子表记录时,由会导致对子表的全表扫描

   b.相反地,如果同时满足以下所有条件,就不用加索引  

     i.不会修改父表主键值且不会删除父表记录

     ii.不存在从父表到子表的连接

3.为什么我的索引没有被用上?

   i. 索引建在 (x,y)复合字段上,但查询谓词只查了x

  ii. select count(*) … 本来用索引就够了,但是如果存在null的数据值,优化器就不敢依赖索引来回答这个查询,因为null值没有索引条目

iii. select … where f(x) = value  不会使用建立在x上的索引,不过它会使用建立在f(x)上的索引

iv. select … where string_column = 5 不会使用索引,因为它实质上是,

      select … where to_number(string_column) = 5 //这是一个基于函数的查询

  v. 需要返回很多行 => 用索引的效率还不如全表扫描的效率

   

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.