第十章 数据存储和数据存取
每个文件分成定长的存储单元,称作块(block),块是存储分配和数据传输的基本单元。
分槽页结构:
分槽的页结构一般用于在块中组织记录。
分槽页页头,在每个块的块头(此处“页”=“块”):记录条目的个数、块中空闲空间的末尾处、一个包含每条记录位置和大小的条目组成的数组。
可以将记录在一页内移动以保证记录之间没有空闲的空间,则数组中信息也要更新。
实际记录从块的尾部开始排列。
块中空闲空间是连续的,在块头数组的最后一个条目和第一条记录之间。
如果插入一条记录,在空闲的尾部给这条记录分配空间,并且将包含这条记录大小和位置的条目添加到块头中。
如果一条记录被删除,它所占用的空间被释放,并且它的条目被设置成删除状态,块中被删除记录之前的记录被移动,是的由此删除产生的空闲空间被重用,并且所有的空闲空间在块头数组的最后一个条目和第一条记录之间。
块头中的空闲末尾指针也要做适当的调整。
对于图片、音频等数据,这些数据比块大很多,可以使用blob和clob数据类型,大对象一般存储到一个特殊文件中,而不是与记录的其他属性存储在一起,然后一个指向该对象的指针存储到包含该大对象的记录中。
堆文件、顺序文件、哈希文件、多表聚蔟文件组织
数据库系统尽量减少磁盘和内存之间的数据块传输数量。可以在主存中保留尽可能多的块来减少磁盘访问次数。
缓冲区:
部分主存用于存储磁盘块的副本。
缓冲区管理:
负责在主存中分配缓冲区空间的子系统。
缓冲区替换策略:
LRU、被钉住的块(不允许写回磁盘的块)、立即丢弃策略(一旦一个块中最后一个元组处理完毕,就命令缓冲区管理器释放这个块所占用的空间)、块的强制写出、MRU
顺序索引、散列索引
主索引(聚集索引):包含记录的文件按照某个搜索码指定的顺序排序,那么该搜索码对应的索引称为主索引,主索引的搜索码常常是主码。
辅助索引(非聚集索引):搜索码指定的顺序与文件中记录的物理顺序不同的索引。或:索引记录指向一个包含所有具有特定搜索码值的实际记录的指针的桶。辅助索引必须是稠密索引。
索引顺序文件:在搜索码上有聚集索引的文件。
散列索引将搜索码及其相应的指针组织成散列文件结构。
严格的说,散列索引只是一种辅助索引结构:
如果一个文件自身是按散列组织的,就不必在其上另外建立一个独立的索引结构;使用散列索引来表示散列文件结构,同时也用它表示辅助散列索引。
在稠密索引中,文件中的每个搜索码值都有一个索引项。
在稀疏索引中,只为搜索码的某些值建立索引项。
只有索引是聚集索引时才能使用稀疏索引。
与稠密索引比较:
所占空间较小,插入和删除时所需的维护开销也较小。
定位一条记录时,通常比稠密索引更慢。
为文件中的每个块建一个索引项的稀疏索引是一个很好的折中。
删除、插入
B+树索引文件是索引顺序文件的一种替代。
索引顺序文件的缺点
随着文件的增大,索引查找性能和数据顺序扫描性能都会下降,这是由于许多溢出块会被创建;频繁重组整个文件是必须的。
B+树索引文件的优点:
在数据插入和删除时,能够通过小的自动调整来保持平衡;不需要重组文件来维持性能。
B+树的缺点
增加文件插入和删除的时间开销,同时会增加空间开销。
B+树利大于弊,被广泛应用
定义:满足以下条件的有根树:
从根结点到叶结点的所有路径长度是一致的;
每一个非根且非叶结点有n/2上界到n个孩子结点;
一个叶结点有(n–1)/2上界到n–1个值。
特殊例子:
如果根结点是非叶结点,它至少有两个孩子结点;
如果根结点是一个叶结点(也就是说,树中没有其他结点),它可以有 0 到 (n - 1) 个值。
桶溢出原因:桶不足、偏斜
桶溢出处理:
溢出链:一个给定桶的所有溢出桶用一个链接列表链接在一起,适用于闭散列。
开散列:桶集合是固定的,没有溢出链,不适用于数据库程序。