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)