《Oracle Concept》第三章 - 6

背景:

按照《Oracle Conecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。


前言《Introduction to Oracle Database》的历史文章

《Oracle Concept》前言-12c内容补充

《Oracle Concept》前言介绍-7

《Oracle Concept》前言介绍-6

《Oracle Concept》前言介绍-5

《Oracle Concept》前言介绍-4

《Oracle Concept》前言介绍-3

《Oracle Concept》前言介绍-2

《Oracle Concept》前言介绍-1

《Oracle Conecpt》 - 目录结构

《Oracle Conecpt》 - 初步认识1


第二章《Tables and Table Clusters》 历史文章

《Oracle Concept》第二章 - 21 (12c内容补充)

《Oracle Concept》第二章 - 20 (12c内容补充)

《Oracle Concept》第二章 - 19

《Oracle Concept》第二章 - 18

《Oracle Concept》第二章 - 17

《Oracle Concept》第二章 - 16

《Oracle Concept》第二章 - 15

《Oracle Concept》第二章 - 14

《Oracle Concept》第二章 - 13

《Oracle Concept》第二章 - 12

《Oracle Concept》第二章 - 11

《Oracle Concept》第二章 - 10

《Oracle Concept》第二章 - 9

《Oracle Concept》第二章 - 8

《Oracle Concept》第二章 - 7

《Oracle Concept》第二章 - 6

《Oracle Concept》第二章 - 5

《Oracle Concept》第二章 - 4

《Oracle Concept》第二章 - 3

《Oracle Concept》第二章 - 2

《Oracle Concept》第二章 - 1


第三章《Indexes and Index-Organized Tables》历史文章:

《Oracle Concept》第三章 - 5

《Oracle Concept》第三章 - 4

《Oracle Concept》第三章 - 3

《Oracle Concept》第三章 - 2

《Oracle Concept》第三章 - 1


本文主题第三章《Indexes and Index-Organized Tables》 - Overview of Indexes。


索引范围扫描

索引范围扫描是一种按序扫描索引的方式,具有如下特征:

  • 在检索条件中指定了索引中的一个或者更多的前导列。条件指定一个或更多的表达式以及逻辑(布尔值)操作符的组合,返回值是TRUE,FALSE或者UNKNOWN。

  • 索引键值可能是0,1或者更多的值。


数据库通常使用索引范围扫描来访问选择度的数据。选择度是检索返回的条数和表中所有数据的百分比,0表示没有任何记录返回,1表示返回的是表中所有行。选择度和检索条件中的一个或者多个谓词紧密相关,例如WHERE last_name LIKE ‘A%’。选择度越接近0,表示谓词可选择度越高,选择度越接近1,表示可选择度越低。


例如,检索employees表last_name以A开头的员工。假设last_name是索引列,如下所示,

640?wx_fmt=png


数据库能使用索引范围扫描,因为last_name列指定在谓词中,并且一个索引键值中可能包含多个rowid。例如,两个员工叫Austin,所以他们俩的rowid会和Austin的键值关联。


索引范围扫描可以是一个范围条件,例如检索departments表的ID值在10和40之间的记录。为了扫描索引,数据库会在索引叶子块上向后或者向前移动。例如,扫描ID值是10和40之间的记录会定位包含最小键值是10的第一个索引叶子块。扫描会沿着水平方向遍历索引叶子节点链条,直到定位键值大于40的值。


索引唯一性扫描

和索引范围扫描相比,索引唯一性扫描要求每个索引键值必须包含0个或1个rowid。当谓词引用了使用等于操作符在唯一索引键值的所有列时,就会执行唯一性扫描。只要发现第一个记录(因为不会有第二个记录),索引唯一性扫描就会停止。


为了解释,假设用户执行了如下的检索:

640?wx_fmt=png


假设employee_id列是主键,索引键值如下:

640?wx_fmt=png


在这个示例中,数据库能使用索引唯一性扫描定位雇员ID是5的记录rowid。


索引跳跃扫描

索引跳跃扫描使用复合索引的逻辑子索引。如果语句检索的是单独的一个索引项,数据库会“跳过”复合索引前导列。如果复合索引前导列的唯一值很少,并且很多不同值在索引的非前导列的时候,索引跳跃扫描是非常有用的。


当复合索引的前导列不在检索谓词中的时候,数据库才可能选择索引跳跃扫描。例如,假设在sh.customers表中检索一个顾客:

640?wx_fmt=png


顾客表列cust_gender的值是M或者F。假设存在一个复合索引,列为(cust_gender, cust_email)。下面例子展示了索引项部分。

640?wx_fmt=png


数据库能使用索引跳跃扫描,即使cust_gender不在WHERE子句中。


在跳跃扫描中,逻辑子索引的个数是由前导列唯一值的个数决定的。在上面的例子中,前导列只有两个可能的值。数据库会从逻辑上将索引分为键值F和键值M的两个子索引。


当检索email是Abbey@company.com的顾客记录时,数据库会扫描键值为F的子索引,然后扫描键值为M的子索引。从原理层面,数据库会执行下面的检索:

640?wx_fmt=png


可以参考:

《Oracle Database Performance Tuning Guide》了解有关跳跃扫描的信息。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读