背景:
按照《Oracle Conecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。
前言《Introduction to Oracle Database》的历史文章:
第二章《Tables and Table Clusters》 历史文章:
《《Oracle Concept》第二章 - 21 (12c内容补充)》
《《Oracle Concept》第二章 - 20 (12c内容补充)》
第三章《Indexes and Index-Organized Tables》历史文章:
本文主题:第三章《Indexes and Index-Organized Tables》 - Overview of Indexes。
索引范围扫描
索引范围扫描是一种按序扫描索引的方式,具有如下特征:
数据库通常使用索引范围扫描来访问选择度的数据。选择度是检索返回的条数和表中所有数据的百分比,0表示没有任何记录返回,1表示返回的是表中所有行。选择度和检索条件中的一个或者多个谓词紧密相关,例如WHERE last_name LIKE ‘A%’。选择度越接近0,表示谓词可选择度越高,选择度越接近1,表示可选择度越低。
例如,检索employees表last_name以A开头的员工。假设last_name是索引列,如下所示,
数据库能使用索引范围扫描,因为last_name列指定在谓词中,并且一个索引键值中可能包含多个rowid。例如,两个员工叫Austin,所以他们俩的rowid会和Austin的键值关联。
索引范围扫描可以是一个范围条件,例如检索departments表的ID值在10和40之间的记录。为了扫描索引,数据库会在索引叶子块上向后或者向前移动。例如,扫描ID值是10和40之间的记录会定位包含最小键值是10的第一个索引叶子块。扫描会沿着水平方向遍历索引叶子节点链条,直到定位键值大于40的值。
索引唯一性扫描
和索引范围扫描相比,索引唯一性扫描要求每个索引键值必须包含0个或1个rowid。当谓词引用了使用等于操作符在唯一索引键值的所有列时,就会执行唯一性扫描。只要发现第一个记录(因为不会有第二个记录),索引唯一性扫描就会停止。
为了解释,假设用户执行了如下的检索:
假设employee_id列是主键,索引键值如下:
在这个示例中,数据库能使用索引唯一性扫描定位雇员ID是5的记录rowid。
索引跳跃扫描
索引跳跃扫描使用复合索引的逻辑子索引。如果语句检索的是单独的一个索引项,数据库会“跳过”复合索引前导列。如果复合索引前导列的唯一值很少,并且很多不同值在索引的非前导列的时候,索引跳跃扫描是非常有用的。
当复合索引的前导列不在检索谓词中的时候,数据库才可能选择索引跳跃扫描。例如,假设在sh.customers表中检索一个顾客:
顾客表列cust_gender的值是M或者F。假设存在一个复合索引,列为(cust_gender, cust_email)。下面例子展示了索引项部分。
数据库能使用索引跳跃扫描,即使cust_gender不在WHERE子句中。
在跳跃扫描中,逻辑子索引的个数是由前导列唯一值的个数决定的。在上面的例子中,前导列只有两个可能的值。数据库会从逻辑上将索引分为键值F和键值M的两个子索引。
当检索email是Abbey@company.com的顾客记录时,数据库会扫描键值为F的子索引,然后扫描键值为M的子索引。从原理层面,数据库会执行下面的检索:
可以参考:
《Oracle Database Performance Tuning Guide》了解有关跳跃扫描的信息。