什么是过滤因子
过滤因子(FF)是某张表中满足谓词条件的行数占全表行数的比例,描述了谓词的选择性。比如某个课外兴趣班每加入一个男生,则谓词sex=’M’的过滤因子就会变大(重复率变高),所以
过滤因子越小越适合建索引(位图索引除外)。
计算公式
1.
过滤因子(FF)= 结果集的数量 / 表总行数
比如,一个班级的总人数是50人,男生占30人,因此谓词sex=’M’的过滤因子就是30/50=60%
2.
平均过滤因子 = 1 / count(distinct(XXX))
因此,在评估一个索引创建的必要性时,最差的情况下的过滤因子大小(趋近于100%)比平均过滤因子更重要,因为最差情况的输入条件下,基于特定索引的查询消耗的时间最长。
组合谓词的过滤因子计算
1. 如果组合谓词中的列与列之间毫无关联(非关联列),则组合谓词的过滤因子大小就可以通过每个谓词的过滤因子计算出来。比如某地区的人口信息表中的组合谓词“Name = ‘XXX’ and Education=‘XX’”中的这两个列(姓名和学历)找不出任何关联(因为同名的人很多),所以该组合谓词的过滤因子=FF(NAME)* FF(ADDR)
2. 如果组合谓词中的列与列之间有一定的关联(关联列),则组合谓词的过滤因子大小大于每个谓词的过滤因子计算出来的乘积。比如汽车制造商信息表中的组合谓词“Make=’XXX’ and Model=’XXXX’”可能存在强关联,因为一个汽车型号可能只属于一个特定的制造商(比如只有特斯拉才制造Model Y型汽车,所以仅通过MODEL=’Model Y’这个条件我们就可以无需查询另一个条件就能知道最终结果大小),因此假设FF(make)=0.1%,FF(model)=0.01%,所以该组合谓词的过滤因子一定大于或远大于0.1% * 0.01%的乘积,
因此在实际生产环境中这种组合谓词不推荐使用,影响了查询效率,也有可能影响了统计信息的准确性(即使是人为手动收集统计信息也会不准确)。
重要说明
1. 不同数据库厂商对选择性这个概念的定义不同,Oracle是“不同值的行数除以表中的记录数”,Sybase是“索引中重复的键值比例”,本文以Oracle数据库作为案例,所以采用Oracle厂商的定义。
2.
对于另一个名词“高选择性”,不同的人会有截然相反的理解:有人认为是“一个选择性很高的数字(谓词重复率高)”,有人认为是“一个选择性很低的数字(谓词重复率低)”。本人习惯于后者的说法,因此本人的文章中的“高选择性”就表示:“一个选择性很低的数字”