频道栏目
读书频道 > 数据库 > Oracle > 高并发Oracle数据库系统的架构与设计
2.3.1 索引选择度
2014-11-28 14:42:47     我来说两句
收藏   我要投稿
Foreword?推 荐 序 一文以载道 书以自娱侯松的新书付梓,嘱我为序,品读精华章节,览其前言,心有所感,遂言而记之。关于写作之因由,于作者来说,一直是最为重要的缘起。认真地写作一本好书,其中的坚持、勤  立即去当当网订购
在这里,我们先抛出一个问题:什么时候需要用索引呢?有些人会说选择度20%以下,有些人会说10%以下,这样的回答都不尽然,甚至可以说是不负责的。我们还是需要根据具体情况来具体分析的。
 
众所周知,需要索引发挥出较高的使用效率,则在通过索引进行查询的时候,其选择度需要控制在一个较小的范围内。但是,也需要考虑数据的实际分布情况。这里我们引入两个概念:
索引理想选择度 = 1 / 索引列的DISTINCT数; 
索引实际选择度 = 返回结果集行数 / 全表行数。
 
通常情况下,我们所说的索引选择度就是上面所说的实际选择度。那么理想选择度是怎么来的呢?
 
我们知道当一个表的NUM_DISTINCT值越接近NUM_ROWS值,则优化器越倾向于走索引扫描。那么最优情况是NUM_DISTINCT=NUM_ROWS(典型代表为唯一索引,此类索引为理想状态索引,扫描效率最高),最差情况则是NUM_DISTINCT=1(不考虑空表和Null值)。引进一个比例NUM_ROWS/NUM_DISTINCT来表示其关联性,该比例的值越小则越优。通过一般情况与最差情况的对比,可以得到一般情况下的选择度,这个选择度就是一般情况的理想选择度。
 
理想选择度=(NUM_ROWS/NUM_DISTINCT)/(NUM_ROWS/1)=1/NUM_DISTINCT
可以说理想选择度反映了优化器选择的倾向性。换而言之,如果希望优化器尽可能地选择索引扫描,则索引设计上尽可能地参考理想选择度的原则,它给索引设计提供一定的指导意义。
 
至于NUM_ROWS和NUM_DISTINCT的值可以通过扫描表获取,也可以通过如下方式查询数据字典获取(必须收集统计信息):
SQL> select num_rows from dba_tables;
SQL> select num_distinct from dba_tab_cols;
细心的读者读到这里应该已经察觉到了,我们这里说的理想选择度其实就是执行计划中“集势”(Cardinality)的一个重要因子。集势因子是CBO优化器COST成本计算的重要标准,可以说它反映了优化器的计算方式,也是决定是否走索引的关键因素。
 
索引列的集势因子如表2-3所列:
 
 
从集势因子来看,不难看出“<>”和“NOT IN”的情况比较难以高效使用索引。而对“=”,“<、>、<=、>=”和“IN”的情况,基本上都可以由1/NUM_DISTINCT决定,也可以说它们最小公约数单元就是等值查询。这个因子,也就是我们所说的理想选择度,基本上可以反映索引列各种高效查询的优化器成本计算情况。
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.3 索引设计优化
下一篇:2.3.2 数据分布的影响
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站