不走索引的几种情况
1、查询谓词没有使用索引的主要边界,换句话说就是SELECT *可能会导致不走索引。 比如:SELECT * FROM T1 WHERE C1 = ‘XXX’;假如你的T1表上有一个包含C1值的组合索引,但是优化器会认为需要一行行的扫描会更有效,这个时候,优化器可能会选择TABLE ACCESS FULL,但是如果换成SELECT C1 FROM T1 WHERE C1 = ‘XXX’;优化器会直接去索引中找到C1的值,因为从B树中就可以找到相应的值。 2、单键值的B树索引列上存在null值,导致COUNT( )不能走索引。 比如:在B树索引中有一个空值,那么查询SELECT COUNT( ) FROM T1;的时候,因为HASHSET中不能存储空值,所以优化器不会走索引,有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T1 WHERE XXX IS NOT NULL;或者把这个字段的属性改为not null。 3、索引列上有函数运算,导致不走索引。 比如:SELECT * FROM T1 WHERE EXTRACT(YEAR FROM C1) = ‘XXX’;即使在T1表上有一个索引包含C1字段,这个时候索引也不会被用到,因为你要查询的列中所有的行都要被计算一遍,因此要效率提高的话,在这个表上建立一个基于函数的索引,比如CREATE INDEX IDX