《Oracle Concept》第三章 - 13

背景:

按照《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,

《Oracle Concept》第三章 - 13_第1张图片

从概念上理解,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篇文章分类和索引》

你可能感兴趣的:(《Oracle Concept》第三章 - 13)