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

5 Indexes and Index-Organized Tables

Overview of Bitmap Indexes

Bitmap Join Indexes

位图连接索引

位图连接索引是用于两个或更多表连接的位图索引。

对于表列中的每个值,索引存储被索引表中对应行的rowid。相比之下,标准的位图索引是在单个表上创建的。

位图连接索引通过提前执行限制条件,是减少必须连接的数据量的有效手段。举例来说,假设用户经常查询具有特定职位类型的员工数量。一个典型的查询可能如下所示:

SELECT COUNT(*)
FROM employees, jobs
WHERE employees.job_id = jobs.job_id
AND jobs.job_title = 'Accountant';

上述查询通常会使用jobs.job_title上的一个索引检索Accountant的行,然后通过职位ID,并使用一个employees.job_id上的索引找到匹配的行。如果要从索引本身而不是从表的扫描中检索数据,您可以创建一个位图连接索引,如下所示:

CREATE BITMAP INDEX employees_bm_idx
ON employees (jobs.job_title)
FROM employees, jobs
WHERE employees.job_id = jobs.job_id;

如下图所示,索引键是jobs.job_title,被索引的表是employees。

图5-2 位图连接索引

从概念上讲,employees_bm_idx 是 以下SQL 查询中(包含示例输出)jobs.job_title列的索引。
索引中的job_title键指向 employees 表中的行。对会计师数量的查询会使用该索引来避免访问 employees 和 jobs 表,因为索引本身已包含所需的信息。

SELECT jobs.job_title AS "jobs.job_title", employees.rowid AS
"employees.rowid"
FROM employees, jobs
WHERE employees.job_id = jobs.job_id
ORDER BY job_title;

|jobs.job_title                     |employees.rowid   |
|-----------------------------------|------------------|
|Accountant                         |AAAQNKAAFAAAABSAAL|
|Accountant                         |AAAQNKAAFAAAABSAAN|
|Accountant                         |AAAQNKAAFAAAABSAAM|
|Accountant                         |AAAQNKAAFAAAABSAAJ|
|Accountant                         |AAAQNKAAFAAAABSAAK|
|Accounting Manager                 |AAAQNKAAFAAAABTAAH|
|Administration Assistant           |AAAQNKAAFAAAABTAAC|
|Administration Vice President      |AAAQNKAAFAAAABSAAC|
|Administration Vice President      |AAAQNKAAFAAAABSAAB|
.
.
.

在数据仓库中,连接条件是维度表的主键列与事实表中的外键列之间的等值连接(使用相等运算符)。位图连接索引在存储上有时比物化连接视图更高效,这是一种替代提前物化连接的方法。

另请参阅:

  • Oracle Database Data Warehousing Guide 获取有关位图连接索引的更多信息。
Bitmap Storage Structure

位图存储结构

Oracle Database使用B树索引结构来存储每个索引键的位图。

举例来说,如果jobs.job_title是一个位图索引的键列,那么用一个B树存储索引数据。叶子块存储各个位图。

示例5-6 位图存储示例

假设jobs.job_title列具有唯一值Shipping Clerk、Stock Clerk以及其他几个。该索引的位图索引条目具有以下组成部分:

  • 作为索引键的工作职位
  • 一个rowid范围的低值rowid和高值rowid
  • 该范围内特定rowid的位图

从概念上讲,该索引中的索引叶子块可能包含以下条目:

Shipping Clerk,AAAPzRAAFAAAABSABQ,AAAPzRAAFAAAABSABZ,0010000100
Shipping Clerk,AAAPzRAAFAAAABSABa,AAAPzRAAFAAAABSABh,010010
Stock Clerk,AAAPzRAAFAAAABSAAa,AAAPzRAAFAAAABSAAc,1001001100
Stock Clerk,AAAPzRAAFAAAABSAAd,AAAPzRAAFAAAABSAAt,0101001001
Stock Clerk,AAAPzRAAFAAAABSAAu,AAAPzRAAFAAAABSABz,100001
.
.
.

同一工作职位出现在多个条目中,因为rowid的范围不同。

如果一个会话将一个员工的工作ID从Shipping Clerk更新为Stock Clerk。在这种情况下,会话需要对旧值(Shipping Clerk)和新值(Stock Clerk)的索引键条目进行独占访问。Oracle Database锁定这两个条目指向的所有的行,但不锁定Accountant或任何其他键指向的行,直到更新提交。

位图索引的数据存储在一个段中。Oracle Database将每个位图存储在一个或多个片段中。每个片段占据单个数据块的一部分。

另请参阅:

  • "User Segments"解释了不同类型的段以及段是如何创建的。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值