存储与索引(陈志华)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可扩展哈希法的基本方法
可扩展哈希法的基本技术是使用哈希函数h得到二进制数,然后解释后d 位数作为目录的偏移量,这里d依赖于目录的大小。上述示例中,d最初是2, 因为只有4个桶。分裂后,d变为3,因此现在有8个桶。当项在原桶和它分 裂映像桶间重分布时,应该在第d位的基础上进行。数字d被称为全局深度 (GLOBAL DEPTN),并作为文件头的一部分保存起来,在每次需要定位 数据项时,都要使用它。 为了确定目录是否需要加倍,需要为每一个桶维护一个局部深度(LOCAL DEPTN)。如果一个桶的局部深度等于全局深度,且需要分裂时,目录必 须加倍。如图(c)索引中插入9*时,它属于局部深度为2的B桶,而全局深 度为3。尽管桶被分裂但目录不必分裂。另一方面A桶和A2桶的局部深度等 于全局深度,如果他们被填满,有需要分裂,目录就必须分裂。
此图展示的是关 系型DBMS的缓 冲区管理策略, 即: 缓冲区管理器直 接控制主存,相 应内存访问磁盘 块的请求。
缓冲区管理结构-缓冲池
高层代码的页请求 正在访问的Frame
Dirty Frame
Free Frame 已访问完且未被 修改的数据
如果所需的页不再Buffer Pool中且Buffer Pool已满 则用替换策略进行调度
4
缓冲区管理结构
• 两种主要的缓冲区管理结构 1、缓冲区管理器直接控制主存。这种管理结构在大多数关 系型DBMS中使用。
2、缓冲区管理器在虚拟内存中分配缓冲区,并由操作系统 干预缓冲区分配。这种管理结构在大多数“主存”DBMS和 面向对象的DBMS中使用。
5
缓冲区管理策略
读 /写 请求 缓冲区
缓冲区 管理器
组织数据项方法之一是按照搜索码对数据进行哈希。另一种方法是建立 一个树状的数据结构,将搜索定位到数据项
8.3索引数据结构
如上图所示,左边表示的是树结构索引的一个实例,右边表示的是哈 希索引的一个实例。
8.3.1 基于哈希的索引
Hash:译“散列”,也译“哈希”,一种将任意长度的输入压缩到某
一固定长度的输出的方法;
Introduction of storage and index (存储与索引概述)
目录
1
外部存储上的数据 文件组织与索引 索引数据结构 基于哈希的索引 树结构索引
2
3 4 5
8.1 外部存储上的数据
DBMS存储了大量的数据,并且数据要在程序执行过程中保持持久性。 因此数据要存储在诸如磁盘和磁带的外部存储设备上,并在需要处理时 载入内存。磁盘上读写信息的单位是夜,页的大小是DBMS的一个参数, 典型的值是4KB或8KB。 页I/O(从磁盘输入到主存及主存输入到磁盘)的代价代表了典型的 数据库操作的代价,因此需要小心的优化数据库系统尽量减小这个代价。 下面介绍存储设备的一些特性: 1 磁盘是最重要的外存设备。按照页面存储的物理顺序连续读取若干页, 所花的代价更小。 2 磁带是顺序访问设备,我们必须一页一页地读。通常用于不常用数据 存储。 3文件中的每一记录都有一个唯一的标示符,称为记录id,简称rid。一 个rid有一个属性,可以用它来表示包含该记录的页在磁盘上的地址。 为了处理,数据需要读入内存;为了持久存储,数据需要写入磁盘。 这些操作都是由称为缓冲区管理器的软件来完成的。这就涉及到缓冲区 的概念了!
可扩展哈希--实例
• 目录由4个元素的数值组成,每个 元素都是一个指向桶的指针。 • 要定位一个数据项,首先在查找 键上应用哈希函数,然后从它的 二进制表达中取后两位得到一个0 到3之间的数,根据这个数在目录 位置上的指针指向期望的桶。 – 定位哈希值为5(二进制101) 的数据项,查找目录元素01, 然后沿着指针找到数据页(桶 B)。
可扩展hash表简介:它在静态hash结构中主要增加如下: 引入了一个间接层(目录),它包含一个指向桶的指针数组,每一个 指针指向一个桶; 指针数组可以增长,它的长度总是2的倍数; Hash函数h为每个键计算出一个K位二进制序列,该K值足够大,无论 何时桶的数目都是使用从序列末尾开始的若干位。
静态hash的插入与删除
为了插入一个数据项,需要使用哈希函数首先确定正确的桶,然后把 项放入桶中。如果该桶没有足够的空间存放该数据项,则需分配一个 新的溢出项,把项放在溢出页上,再把溢出页加到该桶的溢出链上。 为了删除一个数据项,需要使用哈希函数首先确定正确的桶,然后搜 索桶,找到数据项,并删除它。如果这个数据项是一个溢出页的唯一 一项数据,则该溢出页将从桶的溢出链中移出,并加入到空闲页列表 中。
可扩展哈希--插入
• 插入 • 定位桶,如果桶未满,直接插入; • 如果桶满,则需要分裂(分配新的 页,重分布)。如有必要,需加倍 目录。
插入h(r)=20的目录
插入h(r)=20前(a)
插入h(r)=20时(b)
Байду номын сангаас
插入h(r)=20后(c)
要插入数据项20,首先查询目录元素00,并沿着它到达桶A,刚好桶A是满 的。于是通过分配一个新桶而分裂桶A,然后在原来的桶和它的分裂印象之 间重新分部内容。为了重新分布项,需要考虑h(r)的最后三位。后两位是 00,说明该项属于上述两个桶之一,第三位(从尾部算起)则用于区别这 两个桶。如,指向桶A目录元素第三位为0,而指向桶A2目录元素第三位为 1。此时目录不够用,应该加倍,只有第三位不同的元素被称为是“对应” 的。
记录文件是DBMS中的一个重要抽象,并且被文件及访问方法层的代码
数据项的三种不同的表达方式:
(1)数据项k*是一个真正的数据记录。 (2)数据项是一个<k,rid>对,其中rid是搜索码值为k的数据记录的记录id。 (3)数据项是一个<k,rid-list>对,其中rid-list是搜索码值为k的数据记录的 记录id的列表。 第一种方式,每个项k*就是一个搜索码值为k的数据记录。第二和第三方式包 含指向数据记录的数据项,并独立于被索引文件的文件组织与第二种方式相比, 第三种方式更好地利用了空间,但是其数据项是变长的,其长度依赖于给定搜 索码值对应的数据记录。 如果想在一个数据记录的集合上建立多个索引,至少一个索引应该采取第一 种方式,这是为了避免多次存储数据记录的情况发生。
缓冲区概述
• 缓冲区:主存储器中用于存储磁盘块的拷贝的部分,由固定数目的缓 冲块构成。 • 缓冲区设置目的:减少磁盘和主存储器之间传输的块的数目。提高数 据传输效率。 • 缓冲区管理器:负责缓冲区空间分配的子系统。 • 缓冲区管理器软件层:在必要时把页面从磁盘取到主存的软件层。 一些概念: 缓冲池(Buffer Pool): 即页集,通过把缓冲区划分为不同的缓冲池 来进行管理。 帧(frame):缓冲池中的每页。 页:磁盘上读写信息的基本单位,大小相等的片。经典的页大小值是 4KB或8KB。
不过这个定义太抽象了。在SQL Server中,索引是通过二叉树的数 据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据 节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向 对应的数据块。如下图:
如上图所示,索引的搜索码指向的是一个节点,该节点指向叶节点,而叶 节点存储的数据项指向了数据记录的具体位置,但是这些数据项是无序的, 他们的顺序与数据记录的顺序没有关系。
静态哈希的优缺点
理想情况下查询只需要一次磁盘I/O,且文件的插入和删除操作也 只需要两次I/O(读和写)。 静态哈希的桶数固定。如果一个文件缩减太大,会浪费很多空间; 如果文件增长很大,将产生较长的溢出链,导致性能下降。 可扩展哈希可解决这一问题
8.3.1.2可扩展哈希
为了理解可扩展的哈希方法,首先考虑静态哈希文件。如果现在需要 向一个满的桶中插入一个新的数据项,如果不想增加溢出页,而重新组 织文件,把桶数加倍,并且桶集合中重新分配项,很麻烦。一个简单的 方法是:使用一个指向桶的指针目录,同时仅仅通过目录加倍和分裂溢 出桶来实现桶数的加倍。
8.2.1 聚簇索引和非聚簇索引
聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非 聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此, 所以一个表最多只能有一个聚簇索引。由定义可知,使用第一种方式的 索引是聚簇索引。使用第二种和第三种方式的索引只有数据记录按照搜 索码排序时才是聚簇索引,否则数据记录是任意排列的,仅仅有它们的 物理顺序排列,那么将索引的数据项按照数据记录的顺序排列是没有意 义的。
4.系统控制
8.2 文件组织与索引
实现。文件可以被创建、删除以及向其中插入或删除记录。一个关系通 常存储为一个记录文件。文件层将文件中的记录存储于一组磁盘页,并 且跟踪分配给每一个文件的所有页以及页的可用空间。 最简单的文件结构是无序文件,或称堆文件。一个堆文件中的数据 在文件页中以任意的顺序排列。堆文件组织支持所有记录的检索或者检 索指定rid的某一特定记录。 索引是在磁盘上组织数据记录的一种数据结构,它用于优化某数据 检索的操作。索引使得我们能够有效地检索满足索引的搜索码字段上的 搜索条件的那些记录。可以在一个给定的数据记录集合上创建多个索引, 每一个索引,都有不同的搜索码,以支持那些不能被文件组织有效支持 的搜索操作。 我们使用术语数据项来指代存储在索引文件的记录。搜索码值为k的 数据项记为k*,包含有足够的信息以定位搜索码值为k的数据记录。我 们可以有效地搜索一个索引来找到想要的数据项,然后使用这些数据项 来获得数据记录。
如上图所示,索引的叶节点存储的数据项指向数据记录,数据项的顺 序与数据记录的顺序相同。
索引块与数据块的区别
大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空 间小,所以访问速度块。让我们来算一道数学题:如果表中的一条记录 在磁盘上占用1000字节的话,我们对其中10字节的一个字段建立索引, 那么该记录对应的索引块的大小只有10字节。我们知道,SQL Server 的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间, 那么这一个页可以存储上述记录8条,但可以存储索引800条。现在我 们要从一个有8000条记录的表中检索符合某个条件的记录,如果没有 索引的话,我们可能需要遍历8000条×1000字节/8K字节=1000个页 面才能够找到结果。如果在检索字段上有上述索引的话,那么我们可以 在8000条×10字节/8K字节=10个页面中就检索到满足条件的索引块, 然后根据索引块上的指针逐一找到结果数据块,这样IO访问量要少的多。
缓 冲 区 管 理 器 流 程
缓冲区替换策略
选择不同的替换策略进行页面替换显然影响着数 据库的执行效率,现介绍集中比较主流的替换策 略。 1.LRU:最近最少使用策略 2.FIFO:先进先出策略 3.Clock:“时钟”策略
算法实现: 3.1、为每一个缓冲区设置一个标志位,该位的值为1时表示该帧被访 问过,该位为0时表示该位可以被替换。 3.2、按照顺时针轮转的方式查看标志位,选择最近的一个标志为0的 帧进行页面替换。
8.3.1.3线性哈希
线性哈希和可扩展哈希一样,是一种动态哈希技术,可以有效地支持插入和 删除操作,它不需要目录,能自然的处理冲突并且对桶分裂的时机提供很多 灵活性。
线性哈希的数学原理: 假定key = 5 、 9 、13 key % 4 = 1 现在我们对8求余 5%8=5 9 % 8=1 13 % 8 = 5 由上面的规律可以得出 (任意key) % n = M (任意key) %2n = M或 (任意key) %2n = M + n
Hash函数:将查找键为参数并计算出一个介于0到N-1的整数,其中N是 桶的数目;
8.3.1.1静态索引
桶数组:一个序号从0到N-1的数组中包含N个存储块,每一个对应 数组中的一个桶; H:哈希函数 溢出链。 包含数据的页被看作是桶的集合,每个桶中有一个主页,还可能有一 些溢出页。一个文件由桶0到N-1组成部分,初始时每个桶有一个主 页。桶中存放数据项。为了搜索一个数据项,需要利用一个哈希函数 h确定项所在的桶,然后搜索这个桶。