背景:
按照《Oracle Concept》的结构一起了解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》第三章 - 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》 - Overview of Indexes。
这章我们开始介绍位图索引相关的内容,不像普通的B树索引,位图索引存在他的适用场景,在使用前,一定要判断场景,否则不会带来效率的提升,反而会产生性能的问题。
位图连接索引
位图连接索引是一种连接两张或多张表的位图索引。表列中的每个值,索引都会将其对应行的rowid存储到索引表中。相比而言,一个标准的位图索引则是在一张表上创建的索引。
对事先需要执行关联检索的场景,位图连接索引是一种降低数据量的有效方法。举个使用位图连接索引提高效率的例子,假设用户经常根据一个特定的job类型检索员工的总数。一种典型的检索语句如下所示,
SELECT COUNT(*)
FROM employees, jobs
WHERE employees.job_id = jobs.job_id
AND jobs.job_title = 'Accountant';
这个查询会使用jobs.job_titile的索引来检索Accountant对应的行,然后通过job 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,
从概念上理解,employee_bm_idx是jobs.title列的索引。索引中的job_title键指向的是employees表的行。检索Accountants数量的查询,能够用上索引,以此避免访问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》,可以查询到关于位图连接索引的更多信息。
位图存储结构
Oracle数据库使用B树索引结构来存储每个索引键值的位图。例如,如果jobs.job_title是位图索引的键值列,索引数据就会存储在一个B树中。每个位图都存储在叶子块中。
假设jobs.job_title列有唯一的值Shipping Clerk,Stock Clerk和其他的一些值。位图索引项会包含以下部分:
作为索引键值的job title。
一组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不同,相同的job tilte可能出现在不同的项中。
假设一个会话更新某个雇员的job ID从Shipping Clerk为Stock Clerk。此时,会话需要排他地访问旧值(Shipping Clerk)和新值(Stock Clerk)的索引键值项。Oracle数据库会锁定被这两个项所指定的行,而不是仅仅被Accountant或其他键值所指定的行,直到UPDATE提交。
位图索引的数据会存储在一个段中。Oracle数据库会在一个或者多个片中存储每个位图。每个片则占据了一个数据块的部分空间。
以上位图索引的内容,可以参考:“用户段”章节。
近期的热文:
《Linux下如何快速删除大量碎小的文件?》
《YNWA,同样是我们普通人的鞭策》
《小白是怎么搞懂GC全过程?》
《Gdevops峰会:一起探讨国产分布式数据库的选型与应用》
《海底的下面究竟有什么?》
《几种去重的SQL写法》
《打造国产技术产品的必要性》
《SQL查询总是先执行SELECT语句么?》
《Oracle删除字段的方式和风险,你都了解么?》
《最烧脑的珠峰高程测算过程》
《了解阿克曼转向原理的作用》
《登录缓慢的诡异问题》
《不可不知的7个JDK命令》
《一个Full GC次数过多导致系统CPU 100%的案例排查》
《Java GC的基础知识》
《Linux下的^M困惑》
《Oracle相关提问的智慧技巧》
《很久以前的一篇对初学Oracle建议的文章》
《PLSQL Developer几个可能的隐患》
《从70万字SRE神作提炼出的7千字精华文章》
《从数据误删到全量恢复的惊险记录》
《公众号600篇文章分类和索引》