频道栏目
读书频道 > 数据库 > Oracle > 高并发Oracle数据库系统的架构与设计
2.1.4 索引唯一扫描
2014-11-28 14:17:57     我来说两句
收藏   我要投稿
Foreword?推 荐 序 一文以载道 书以自娱侯松的新书付梓,嘱我为序,品读精华章节,览其前言,心有所感,遂言而记之。关于写作之因由,于作者来说,一直是最为重要的缘起。认真地写作一本好书,其中的坚持、勤  立即去当当网订购
从上面的介绍,我们可以了解到索引扫描的过程其实是扫描索引结构获取ROWID的过程。索引唯一扫描(INDEX UNIQUE SCAN)只能发生在唯一键索引(主键索引实质即为唯一键索引)上,通过唯一索引查找数值往往返回单个ROWID,如图2-3所示,从索引的根(root)节点到枝(branch)节点,再到叶(leaf)节点上存储着一个对应的ROWID,即对应的查询结果也只返回一行,这种存取方法称为“索引唯一扫描”。如果该唯一索引是由多个列组成的组合索引,则至少要有组合索引的前导列参与到该查询中,同样SQL语句只返回一行记录,这也属于索引唯一扫描。
 

 
下面通过一些实例来了解一下该扫描方式的特点。在正式开始之前,我们需要做一点准备工作:
步骤1 创建一下相关的表和主键索引:
SQL> create table alex_t01 (
  2    id number, 
  3    a number, 
  4    b number, 
  5    c number, 
  6    name varchar2(100)
  7    );
SQL> alter table alex_t01 add constraint pk_alex_t01 
  2  primary key (id) using index;
步骤2 初始化数据,顺序地插入10万行数据:
SQL> declare
  2  begin
  3  for i in 1 .. 100000 loop
  4    insert into alex_t01
  5    values
  6      (i, mod(i, 2), mod(i, 20000), mod(i, 20000), 'alex');
  7  end loop;
  8  commit;
  9  end;
 10  /
步骤3 最重要的是收集一下表和主键索引的统计信息和直方图信息(默认开启直方图收集),在缺失统计信息和直方图的情况下,CBO优化器可能无法正确地计算SQL语句的执行成本,直接导致执行计划跑偏,影响性能:
SQL> exec dbms_stats.gather_table_stats('alex','alex_t01')
SQL> exec dbms_stats.gather_index_stats('alex','pk_alex_t01')
准备工作完成后,可以实际执行一下查询SQL语句,进行如下所示的验证。
SQL> select id, name from alex_t01 where id=400;
-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |             |     1 |    10 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| ALEX_T01    |     1 |    10 |     2   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | PK_ALEX_T01 |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
 
我们看到查询筛选条件为id=400,是一个等值查询,返回唯一数据行,执行计划走的是索引唯一扫描方式。
如果这里不是等值查询呢?那么,执行计划将无法按索引唯一扫描方式。换而言之,有且仅当唯一键索引列上发生等值查询时,才会触发索引唯一扫描,返回单行数据。这种索引扫描方式也是最高效的索引扫描方式,常见于主键索引的应用场景。
 
我们也可以通过给SQL语句添加HINT关键字的方式,改变执行计划,强制SQL语句走索引扫描,如下所示:
SQL> select /*+ index(alex_t01 pk_alex_t01) */ id, name 
  2  from alex_t01 where id=400;
 
索引唯一扫描是最高效的索引扫描方式,其只对唯一键索引上的等值查询有效。
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.1.3 ROWID扫描
下一篇:2.1.5 索引范围扫描
相关文章
图文推荐
排行
热门
最新书评
特别推荐

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

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