索引的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,那么无论可选择性有多么高,全表扫都比索引读来得快