索引的访问方式

(1)INDEX (UNIQUE SCAN)

唯一索引扫描,即对唯一索引进行单一匹配访问。在唯一索引中,每一个非空键值只会存在一条。主键本身也是一个唯一索引。示例如下:
HELLODBA.COM>exec sql_explain('SELECT * FROM T_XPL WHERE tid=:A', 'TYPICAL');
Plan hash value: 3808404654
------------------------------------------------
| Id  | Operation                   | Name     |
------------------------------------------------
|   0 | SELECT STATEMENT            |          |
|   1 |  TABLE ACCESS BY INDEX ROWID| T_XPL    |
|*  2 |   INDEX UNIQUE SCAN         | T_XPL_PK |
------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("TID"=TO_NUMBER(:A))

(2)INDEX (RANGE SCAN)

索引范围扫描,即对(唯一或非唯一)索引进行范围匹配(>、<、>=、<=、like)访问,或者对非唯一索引进行单一匹配访问。

(3)INDEX (RANGE SCAN (MIN/MAX))

对索引进行范围扫描,以获取索引字段的最大值、最小值。

(4)INDEX (RANGE SCAN DESCENDING)

按照与索引逻辑顺序的相反顺序对索引进行范围扫描。

(5)INDEX (FAST FULL SCAN)

快速完全索引扫描,对索引进行快速完全扫描访问。这种访问方式中,不会按照索引的逻辑顺序访问,而是按照物理顺序读取所有的索引数据块,并且能够每次读取多个数据块。

提示:在B*Tree索引中,含有空键值的数据记录不会被构建到索引中。因此,如果索引字段允许为空的话,在查询索引字段数据时,如果未限制获取非空数据,则无法进行索引快速完全扫描。

(6)INDEX (SAMPLE FAST FULL SCAN)

索引快速完全采样扫描。与采样访问表类似,即以多数据块读取的方式扫描索引的部分数据块。示例如下:
HELLODBA.COM>exec sql_explain('SELECT /*+index_ffs(t_xpl t_xpl_idx1)*/tname FROM T_XPL SAMPLE(5) WHERE
tname is not null', 'TYPICAL');
Plan hash value: 1323535488

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    24 |     2   (0)| 00:00:03 |
|*  1 |  INDEX SAMPLE FAST FULL SCAN| T_XPL_IDX1 |     1 |    24 |     2   (0)| 00:00:03 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("TNAME" IS NOT NULL)

(7)INDEX (FULL SCAN)

全索引扫描,即对索引进行完全扫描访问。这种访问方式与索引快速完全扫描的区别在于:

1)它是按照索引数据的逻辑顺序而不是物理存储顺序读取;

2)每次只能读取一个而不是多个数据块。

(8)INDEX (FULL SCAN (MIN/MAX))

对索引进行完全扫描访问,以获取索引字段的最大值、最小值。

(9)INDEX (FULL SCAN DESCENDING)

以索引逻辑顺序相反的顺序对索引进行完全扫描访问。

(10)INDEX (SKIP SCAN)

跳跃索引扫描,即对多字段复合索引扫描时,跳过索引中前导的一个或多个字段,而对后续字段进行匹配。

提示:在建立多字段复合索引时,Oracle会先按字段的顺序构建索引树,如果新数据记录的第一个字段值与索引中已有数据记录的第一个字段值相同,则会对第二个字段进行匹配来排序,以此类推。如果索引中的前导字段(可以是一个或者多个)的可区分数值非常少,即大多数数据记录拥有相同的数值,那么构建的索引树的逻辑结构,大多数都是由后续字段的顺序决定。而在这种情况下,如果一个查询条件中只含有后续字段的过滤条件,在对索引进行扫描时,可以将索引树视为多个小的索引树进行扫描,这种扫描方式就是跳跃索引扫描。

示例如下:
HELLODBA.COM>exec sql_explain('SELECT * FROM t_objects where object_name=:A','TYPICAL');
Plan hash value: 3426433533
----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     2 |   234 |    15   (0)| 00:00:16 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T_OBJECTS      |     2 |   234 |    15   (0)| 00:00:16 |
|*  2 |   INDEX SKIP SCAN           | T_OBJECTS_IDX1 |     2 |       |    14   (0)| 00:00:14 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_NAME"=:A)
       filter("OBJECT_NAME"=:A)

(11)INDEX (SKIP SCAN DESCENDING)

以复合索引前导字段逻辑顺序的相反顺序进行跳跃索引扫描。

(12)DOMAIN INDEX

访问域索引。

关键词释义

域索引:在Oracle中,除了两种内建的数据结构(B*Tree和位图)外,用户还可以对索引结构进行扩展,建立其他结构的索引,例如四叉树,这需要创建、维护和访问索引的函数支持。由于这样的索引通常用于某个应用领域内,如全文检索。因此,这种索引称为域索引。

示例如下:
HELLODBA.COM>exec sql_explain('select table_name from t_tables where contains(table_name, ''T'') >0',
             'TYPICAL');
Plan hash value: 1749265066
----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     1 |    30 |     5   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T_TABLES       |     1 |    30 |     5   (0)| 00:00:01 |
|*  2 |   DOMAIN INDEX              | T_TABLES_DIX01 |  2071 |       |     4   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("CTXSYS"."CONTAINS"("TABLE_NAME",'T')>0)

(13)BITMAP INDEX (SINGLE VALUE)

位图索引单值范围,即对位图索引中的一个键值进行匹配访问。

关键词释义

位图索引:在Oracle中,存在两种数据结构的索引,一种是普通索引,以B*树结构构建索引,整个索引是树状结构,在叶子节点(即最底层节点)上存储索引记录,每条索引记录中包含了索引字段值和对应数据记录的ROWID,表中的每条数据记录(索引字段非空)在索引中都有一条索引记录,如果索引字段数值相同,则按ROWID顺序存储;另一种是位图索引,位图索引也是树状结构,但是它并不是对表中的每条数据记录都构建一条索引记录,而是将多个物理位置连续的数据记录映射到一条索引记录中,在叶子节点中,索引记录中除了索引字段值外,还包括其映射的多条表数据记录的起始地址和结束地址,最重要的是,它还包含一个位图,位图的每一个(bit)按序对应了一条表记录,位的值为1,说明表记录中的索引字段数值与索引记录中的数值相同,为0则表示表记录与索引记录的索引字段值不匹配。我们会在后面章节详细介绍位图索引的存储方式。
要注意的是,位图索引包含了索引字段为空的数据记录。

在Oracle(9i及以上版本)中,还有一种特殊的位图索引:位图关联索引(Bitmap Join Index)。创建这样的位图索引时,可以与其他表的相关字段进行关联。在对它们以索引字段作为过滤条件进行关联查询时,就可以避免对关联表的读取。创建了位图关联索引后,Oracle会在创建索引的表上建立一个隐藏的虚拟字段,用于优化器选择和产生对应的访问路径。

示例如下:
HELLODBA.COM>exec sql_explain('SELECT /*+index(t1 t_objects_idx3)*/count(1) FROM t_objects t1, t_users
  t4 WHERE t1.owner = t4.username AND t1.status = :A','TYPICAL');
Plan hash value: 1812282537
------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                |     1 |    11 |     1   (0)| 00:00:02 |
|   1 |  SORT AGGREGATE               |                |     1 |    11 |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID | T_OBJECTS      | 15862 |   170K|     1   (0)| 00:00:02 |
|   3 |    BITMAP CONVERSION TO ROWIDS|                |       |       |            |          |
|*  4 |     BITMAP INDEX SINGLE VALUE | T_OBJECTS_IDX3 |       |       |            |          |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("T1"."STATUS"=:A)
   4 - access("T1"."SYS_NC00016$"=:A)

(14)BITMAP INDEX (RANGE SCAN)

位图索引范围扫描,即对位图索引中的多个键值进行匹配访问。

(15)BITMAP INDEX (FULL SCAN)

位图索引完全扫描,扫描方式与普通索引完全扫描类似。

(16)BITMAP INDEX (FAST FULL SCAN)

位图索引快速完全扫描,扫描方式与普通索引快速完全扫描类似。

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

转载于:http://blog.itpub.net/30604784/viewspace-2077160/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值