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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值