我在列上创建了一个索引,它只有两个可能的值(Y和N),两个值的数据类型相同。
假设列名是指标。 我写了一个选择语句,如
SELECT INDICATOR
FROM TEMP_TABLE
ORDER BY INDICATOR
当我在SQL开发人员中使用针对此查询的解释计划时,它使用全表扫描而不是索引扫描。
为什么不使用索引表扫描。
答案 0 :(得分:0)
为了在没有索引的表中查找记录,DBMS需要读取所有记录以找到匹配项。使用索引,DBMS应该只需要读取一组连续的记录来查找匹配,然后在表中找到相应的记录。因此,当DBMS使用索引时,还有一个额外的步骤。
作为一个粗略的经验法则,如果您从表中读取超过5%的记录,那么全表扫描将比索引查找更快。
但数据的分布也很重要。考虑99%的数据是'Y'的情况。使用索引来解析带有'Y'的记录将非常有效(应用我的经验法则的倒数,它将比全表扫描长20倍)。使用索引查找带有'N'的记录的OTOH将比全表扫描效率高5倍。
这就是Oracle将直方图用于更复杂的索引属性的原因。
Oracle还有一个名为bind peeking的功能 - 利用分发问题,根据搜索的谓词选择最有效的查询。花一些时间考虑当查询模式与数据模式匹配时会发生什么 - 缓存计划将取决于首先处理查询的哪个版本。
简短版本:不要在基数非常低的(一组)属性上使用索引。