Oracle官方文档翻译《Database Concepts 23ai》第5章-索引和索引组织表-B树索引概述(5)

5 Indexes and Index-Organized Tables

Overview of B-Tree Indexes

Index Compression

索引压缩

为了减少索引空间,Oracle数据库可以采用不同的压缩算法。

  • 前缀压缩
    Oracle 数据库可以使用前缀压缩,也称为键压缩,来压缩 B 树索引或索引组织表中主键列值的部分。前缀压缩可以大大减少索引占用的空间。
  • 高级索引压缩
    从 Oracle 数据库 12c Release 1(12.1.0.2)开始,高级索引压缩改进了对堆组织表支持的索引的传统前缀压缩。
Prefix Compression

前缀压缩

Oracle 数据库可以使用前缀压缩,也称为键压缩,来压缩 B 树索引或索引组织表中主键列值的部分。前缀压缩可以大大减少索引占用的空间。

一个未压缩的索引条目有一个部分。一个使用前缀压缩的索引条目有两个部分:前缀条目,即分组部分,和后缀条目,即唯一或几乎唯一的部分。数据库通过在一个索引块中的多个后缀条目之间共享前缀条目来实现压缩。

注意:
如果键未定义为具有唯一的部分,则数据库会通过将 rowid 附加到分组部分之后来提供一个唯一部分。

默认情况下,唯一索引的前缀包括除最后一列之外的所有键列,而非唯一索引的前缀包括所有键列。假设您在 oe.orders 表的两列上创建了一个复合唯一索引,如下所示:

CREATE UNIQUE INDEX orders_mod_stat_ix ON orders ( order_mode, order_status );

在上述示例中,一个索引键可能是 online,0。rowid 存储在条目的键数据部分中,不是键本身的一部分。

注意:
如果在单个列上创建唯一索引,则 Oracle 数据库无法使用前缀键压缩,因为不存在共同的前缀。

或者,假设您在相同的列上创建一个非唯一索引:

CREATE INDEX orders_mod_stat_ix ON orders ( order_mode, order_status );

同时假设 order_mode 和 order_status 列中存在重复值。一个索引块可能具有如下示例中所示的条目:

online,0,AAAPvCAAFAAAAFaAAa
online,0,AAAPvCAAFAAAAFaAAg
online,0,AAAPvCAAFAAAAFaAAl
online,2,AAAPvCAAFAAAAFaAAm
online,3,AAAPvCAAFAAAAFaAAq
online,3,AAAPvCAAFAAAAFaAAt

在上述示例中,键前缀将由 order_mode 和 order_status 的串联值组成,例如 online,0。后缀由 rowid 组成,例如 AAAPvCAAFAAAAFaAAa。rowid 使整个索引条目是唯一的,因为数据库中的 rowid 本身是唯一的。

如果在上述示例中创建的索引使用默认前缀压缩(由 COMPRESS 关键字指定),那么例如 online,0 和 online,3 这样的重复键前缀将被压缩。从概念上讲,数据库实现压缩的方式如下:

online,0
AAAPvCAAFAAAAFaAAa
AAAPvCAAFAAAAFaAAg
AAAPvCAAFAAAAFaAAl
online,2
AAAPvCAAFAAAAFaAAm
online,3
AAAPvCAAFAAAAFaAAq
AAAPvCAAFAAAAFaAAt

后缀条目(rowids)形成索引行的压缩版本。每个后缀条目引用一个与其存储在相同索引块中的前缀条目。

或者,您可以在创建一个使用前缀压缩的索引时指定前缀长度。例如,如果指定了 COMPRESS 1,则前缀将是 order_mode,后缀将是 order_status,rowid。对于索引块示例中的值,索引将消除前缀 online 的重复出现,从概念上看如下所示:

online
0,AAAPvCAAFAAAAFaAAa
0,AAAPvCAAFAAAAFaAAg
0,AAAPvCAAFAAAAFaAAl
2,AAAPvCAAFAAAAFaAAm
3,AAAPvCAAFAAAAFaAAq
3,AAAPvCAAFAAAAFaAAt

索引在每个叶块中最多存储一次特定前缀。只有 B 树索引的叶块中的键会被压缩。在分支块中,键后缀可以被截断,但键不会被压缩。

另请参阅:

  • Oracle Database Administrator’s Guide 了解如何使用压缩索引
  • Oracle Database VLDB and Partitioning Guide 了解如何为分区索引使用前缀压缩
  • Oracle Database SQL Language Reference 了解 CREATE INDEX 中 key_compression 子句的描述
Advanced Index Compression

高级索引压缩

从 Oracle 数据库 12c Release 1(12.1.0.2)开始,高级索引压缩改进了对堆组织表支持的索引的传统前缀压缩。

高级索引压缩的优点

前缀压缩对于支持的索引类型、压缩比率和易用性有一些限制。与使用固定的重复键消除的前缀压缩不同,它为每个块使用自适应的重复键消除。高级索引压缩的主要优势包括:

  • 数据库会自动为每个块选择最佳压缩方式,使用多种内部算法,如列内级别前缀、重复键消除和 rowid 压缩。与前缀压缩不同,高级索引压缩不需要用户了解数据特征。

  • 高级压缩适用于非唯一索引和唯一索引。前缀压缩在某些非唯一索引上表现良好,但在前导列没有太多重复值的索引上,压缩比较低。

  • 压缩后的索引可与未压缩的索引一样使用。索引支持相同的访问路径:唯一键查找、范围扫描和快速全表扫描。

  • 索引可以从父表或包含表空间继承高级压缩。

高级索引压缩的工作原理

高级索引压缩在块级别工作,为每个块提供最佳的压缩方式。数据库使用以下技术:

  • 在索引创建过程中,当叶块变满时,数据库会自动将块压缩到最佳级别。

  • 当因为DML而重新组织索引块时,如果数据库可以为新的索引条目创建足够的空间,则不会发生块分裂。然而,在没有使用高级索引压缩的情况下进行DML时,当块变满时总会发生索引块分裂。

高级索引压缩HIGH

在 Oracle 数据库 12c Release 2 (12.2) 之前的版本中,唯一的高级索引压缩形式是低压缩(COMPRESS ADVANCED LOW)。现在您还可以指定高压缩(COMPRESS ADVANCED HIGH),这是默认设置。带有HIGH选项的高级索引压缩提供以下优点:

  • 在大多数情况下提供更高的压缩比率,同时改善访问索引的查询性能

  • 使用比 ADVANCED LOW 更复杂的压缩算法

  • 将数据存储在压缩单元中,这是一种特殊的磁盘格式

注意:
当你使用HIGH压缩时,所有块都进行了压缩。当你使用LOW压缩时,数据库可能会保留一些块不进行压缩。您可以使用统计信息来确定有多少块未被压缩。

示例 5-5 创建具有高级高压缩的索引示例

此示例为 hr.employees 表上的索引启用高级索引压缩:

CREATE INDEX hr.emp_mndp_ix
ON hr.employees(manager_id, department_id)
COMPRESS ADVANCED;

以下查询显示了压缩类型:

SELECT COMPRESSION FROM DBA_INDEXES WHERE INDEX_NAME ='EMP_MNDP_IX';
COMPRESSION
-------------
ADVANCED HIGH

另请参阅:

  • Oracle Database Administrator’s Guide 了解如何启用高级索引压缩
  • Oracle Database SQL Language Reference 了解 CREATE INDEX 中 key_compression 子句的描述
  • Oracle Database Reference 了解 ALL_INDEXES 相关信息

往期内容:
Oracle官方文档翻译《Database Concepts 23ai》第5章-索引和索引组织表-B树索引概述(1)

Oracle官方文档翻译《Database Concepts 23ai》第5章-索引和索引组织表-B树索引概述(2)

Oracle官方文档翻译《Database Concepts 23ai》第5章-索引和索引组织表-B树索引概述(3)

Oracle官方文档翻译《Database Concepts 23ai》第5章-索引和索引组织表-B树索引概述(4)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值