日期:2014-05-16  浏览次数:20383 次

索引的Selectivity
       
       选择性,表示一个行集当中的一小部分行
       这个行集可以是基表,视图,或者一个join的结果集,或者一次group by操作
       选择性受限于查询谓词,比如,last_name='Smith',或者一个联合谓词,比如,last_name='Smith' ADN job_type='Clerk'
       一个谓词就像一个过滤器,从行集当中过滤掉某些行
       因此,一个谓词选择性意味着一个行集当中有多少行将通过谓词的过滤
       选择性的取值范围是∈[0,1]
       0表示没有行从行集当中被过滤出来
       1表示所有行都将被过滤出来
       当统计信息可用时,优化器会依据统计信息评估选择性

       比如,last_name='Smith',选择性被设置为last_name的不同值的数目的倒数,因为查询所选择的行包含N个不同的值

hr@ORCL> select index_name,distinct_keys/num_rows selectivity from user_indexes;

INDEX_NAME                     SELECTIVITY
------------------------------ -----------
REG_ID_PK                                1
COUNTRY_C_ID_PK                          1
LOC_ID_PK                                1
LOC_CITY_IX                              1
LOC_STATE_PROVINCE_IX                    1
LOC_COUNTRY_IX                  .608695652
DEPT_ID_PK                               1
DEPT_LOCATION_IX                .259259259

       计算选择性之前,该索引必须被分析过
       主键的选择性毋庸置疑 绝对为1。选择性越接近1,那么该索引就越好
       
       索引的“可选择性”是指在该索引列里存储的不同值的数目和记录总数的比
       比如某个表的记录数是1000条,而该表的索引列的值只有900个不同的值(有100个是相同或是空)
       这样索引的可选择性为900/1000为0.9 。这样当然效果就不好,最好的索引可选择性(如主键索引)是1.0 
       索引的可选择性是衡量索引的利用率的方法
       比如在极端的情况下,一个表记录数是1000,而索引列的值只有5个不同的值,则索引的可选择性很差(只有0.005)
       这样的情形使用全表扫描要比采用索引还好
       当然了,如果查询所选择的行超过1/3,那么无论可选择性有多么高,全表扫都比索引读来得快