我正在研究 Oracle 10g 中的索引以加快特定查询。我一遍又一遍地读到索引低基数列(具有很少唯一值的列,例如员工表中的性别列)很少有助于加快查找速度。如果该低基数列中的数据是均匀分布的,则这是有道理的,例如约 50% 的员工记录的性别 = 'M',其他约 50% 的性别 = 'F'。但是,如果数据不是均匀分布的,并且您要搜索的记录与大多数记录的键不同,那该怎么办?如果对上面的性别列进行索引,员工表是针对一家有 2% 男性员工和 98% 女性员工的公司,我们只对男性员工进行查询。这种低基数的经验法则仍然成立吗?
我现在处理的情况是一个具有非空二进制列的表,每条记录总是存储 1 或 0。在这个表中,有 99,999 条记录为 0 和一条记录为 1。当我在这个二进制列上有一个 b 树索引时,Oracle 选择了全表扫描。
我想我不理解的部分是当大多数键是重复的时,b-tree 会是什么样子,以及为什么它不能快速找到一组不重复的少数记录。