ITPub博客

首页 > 数据库 > Oracle > 索引的Selectivity

索引的Selectivity

原创 Oracle 作者:幕南风 时间:2014-07-03 13:44:58 0 删除 编辑
       
       选择性,表示一个行集当中的一小部分行
       这个行集可以是基表,视图,或者一个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,那么无论可选择性有多么高,全表扫都比索引读来得快

<!-- Baidu Button BEGIN -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26515977/viewspace-1207974/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 深入理解Oracle表(2):驱动表的那些事儿
下一篇: 深入理解Oracle索引(1):INDEX SKIP SCAN 和 INDEX RANGE SCAN
请登录后发表评论 登录
全部评论
腾讯数据库工程师

注册时间:2012-05-10

最新文章