关于统计信息和过滤因子在《DB2数据库查询过程(Query Processing)----概述》一文中已经作了大致介绍。本文再详细讨论一下。
过滤因子(Filter Factor)
过滤因子是一个间接参数,表示满足特定条件的行占表中所有行的比例,,记作FF(P),P表示条件谓词。过滤因子的值可以根据系统编目中的统计信息计算得出,它的主要作用是在存在多种数据访问方式的时候提供选择参考。
考虑下面这张MOBILE表:
现在该表的CITY列上有索引CITY_IDX,MOBILETYPE列上有索引TYPE_IDX。对于SQL查询语句:
Select * From MOBILE Where CITY='武汉' And MOBILETYPE='中国电信 CDMA'
这个查询语句应该使用哪个索引?
由于对于一张表,只能使用一个索引,对一个条件使用索引读入满足条件的数据行后在使用第二个条件进行进一步的筛选。那么查询优化器如何在CITY_IDX和TYPE_IDX这两个索引之间作出取舍呢?
这时候过滤因子就是一个重要的参考参数。
假设MOBILE表总共有100000行,在CITY上一共有100个不同的取值,记作COLCARD(CITY)=100。在MOBILETYPE上一共有10个不同的取值,记作COLCARD(MOBILETYPE)=10.
那么,对于每一个CITY值A,CITY列上值为A的行平均下来大概是100000/100=1000个。即满足CITY='武汉'的行一共有1000个;同理,满足MOBILETYPE='中国电信 CDMA'的行一共有100000/10=10000个。
假设MOBILE表中的所有行都位于不同的数据页上,如果使用CITY_IDX索引,那么需要读入缓冲池的数据页数为1000页,即1000次I/O;而如果使用TYPE_IDX索引,则需要读入缓冲池的数据页数为10000页,即10000次I/O。整整10倍的差距。当然是用CITY_IDX更好了。
也就是说,根据两个条件的CARD值的不同就可以判断出哪种选择更优了,但是使用COLCARD这样一个绝对的量值来作为衡量标准是非常不便的,于是引入过滤因子(Filter Factor)的概念。
过滤因子是满足条件的值在所有值中所占的比例,以上例为例:满足CITY='武汉'的行为1000,表中总的行数为100000.则:
FF(CITY='武汉')=1000/100000=1/100=0.01
同理,FF(MOBILETYPE='中国电信 CDMA')=10000/100000=1/10=0.1