Oracle为什么没有使用索引场景

      场景1:

      假设有一个表T,在T(x,y)上有一个索引。如果我们做一个查询:select * from t where y=5。此时优化器不会使用索引,因为查询条件中不包含索引最前列(x列)。如果使用索引,可能必须查看每一个索引条目,因为索引键可能是这样排列的:1,2 1,3 1,4 1,5 2,1 2,4 2,6 3,1......我们不知道y=5会在哪个地方出现。但是假如x的取值较少,只有几个,那么会使用索引的。因为索引先是按x排序,后按y排序。如果x可取值很少,那么只需要根据x取值分成几个区间,然后逐个区间根据y值跳跃扫描即可。

      总之,如果你的索引是建立在多列上,如果查询条件中不包含最前列,那么索引大部分情况会无效。

      场景2:

      执行一个统计查询:select count(*) from t,表T上有一个B*树索引,但是查询优化器执行的是全表扫描,而非基于索引扫描。原因可能是,索引建立在允许空的列上,因为B*树索引对完全为null的行不会建立索引,就会漏掉一部分数据。如果按照索引扫描,就会漏掉一部分数据,因此查询优化器执行全表扫描是正确的选择。

      场景3:

      假设表中某一列只包含数字(在该列建立了索引),但是它定义的是字符串。将这一列当做条件进行查询本来该这样写:select * from t where indexed_column = '5'。如果我们这样写:select * from t where indexed_column = 5 就不会使用索引。因为会隐含地将SQL转换成:select * from t where to_number(indexed_column) = 5。因此就不会执行索引了,除非建立一个基于to_number函数的索引。

猜你喜欢

转载自liwenshui322.iteye.com/blog/1703494