5 Indexes and Index-Organized Tables
Overview of B-Tree Indexes
Reverse Key Indexes
反向键索引
反向键索引是一种B树索引类型,它在保持列顺序的同时物理上反转每个索引键的字节。
举例来说,如果索引键是 20,在标准 B 树索引中以十六进制存储的两个字节为 C1,15,那么反向键索引将以 15,C1 的形式存储这些字节。
反转键的操作解决了 B 树索引右侧叶块争用的问题。在 Oracle 真正应用集群(Oracle RAC)数据库中多个实例会反复修改同一个块,这个问题可能尤为严重。举例来说,在一个订单表中,订单的主键是连续的。集群中的一个实例添加订单 20,而另一个实例添加 21,每个实例都将其键写入索引右侧的同一个叶块中。
在反向键索引中,对字节顺序反转,使插入操作分散到索引中的所有叶键上。例如,在标准键索引中本应相邻的键 20 和 21,现在存储在相隔很远的独立的块中。这样,顺序键插入的I/O 操作被更均匀地分布。
由于索引中的数据在存储时不是按列键排序的,在某些情况下,反向键格式失去了运行索引范围扫描查询的能力。例如,如果用户发出一个查询,要求订单 ID 大于 20,但数据库无法从包含这个 ID 的块开始,然后沿着叶块水平推进。
Ascending and Descending Indexes
升序和降序索引
在升序索引中,Oracle数据库按升序存储数据。默认情况下,字符数据按照值中每个字节中包含的二进制值排序,数值数据按照最小到最大排序,日期数据按照最早到最晚排序。
举一个升序索引的例子,考虑以下 SQL 语句:
CREATE INDEX emp_deptid_ix ON hr.employees(department_id);
Oracle 数据库对 hr.employees 表按照 department_id 列排序。它从 0 开始,按照 department_id 和对应的 rowid 值的升序加载升序索引。当使用该索引时,Oracle 数据库搜索已排序的 department_id 值,并使用对应的 rowid 来定位包含有请求的 department_id 值的行。
通过在 CREATE INDEX 语句中指定 DESC 关键字,您可以创建降序索引。在这种情况下,索引按照指定的一列或多列的降序存储数据。如果在表 5-3中employees.department_id 列上的索引是降序,那么包含 250 的叶块将位于树的左侧,而包含 0 的块将位于右侧。通过降序索引的默认搜索是从最高值到最低值。
当查询对一些列进行升序排序,而另一些列进行降序排序时,降序索引非常有用。例如,假设您按照以下方式在 last_name 和 department_id 列上创建一个复合索引:
CREATE INDEX emp_name_dpt_ix ON hr.employees(last_name ASC, department_id DESC);
如果一个用户按照姓氏升序(A 到 Z)和部门 ID 降序(从高到低)查询 hr.employees,则数据库可以使用此索引检索数据,而无需额外的排序步骤。
另请参阅:
- Oracle Database SQL Tuning Guide 了解更多关于升序和降序索引搜索的信息。
- Oracle Database SQL Language Reference 了解 CREATE INDEX 中 ASC 和 DESC 选项的描述。
往期内容:
Oracle官方文档翻译《Database Concepts 23ai》第5章-索引和索引组织表-B树索引概述(1)