《Oracle Concept》第二章 - 19
这是杂货铺的第459篇文章
背景:
按照《Oracle Conecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。
前言《Introduction to Oracle Database》的历史文章:
第二章《Tables and Table Clusters》 历史文章:
本文主题:第二章《Tables and Table Clusters》 - Overview of Tables。
哈希聚簇变量
单表哈希聚簇是一次仅支持一张表的哈希聚簇的优化版本。哈希键和行是一对一的映射关系。当用户通过主键需要快速访问表的时候,单表哈希聚簇是非常有用的。例如,用户会经常通过employee_id在employees表中检索雇员记录。
排序的哈希聚簇会根据哈希函数存储对应的行,数据库会按照顺序高效地返回记录。数据库内部会执行优化排序。对于通常需要对数据做排序的应用来说,这项技术能意味着更快的数据检索。例如,某个应用可能总要对orders表的order_date列进行排序。
参考:
《Oracle Database Administrator's Guide》可以了解如何创建单表和排序的哈希聚簇。
哈希聚簇存储
Oracle数据库对于哈希聚簇的空间分配不同于索引聚簇。在示例2-9中,HASHKEYS指定了可能存在的部门个数,SIZE指定了和每个部门相关的数据容量。数据库会基于下面的公式计算出存储空间值:
HASHKEYS * SIZE / database_block_size
因此,在示例2-9,如果块大小是4096字节,那么数据库将会给哈希聚簇至少分配200个块。
Oracle数据库不会限制你能插入聚簇的哈希键值个数。例如,即使HASHKEYS是100,你还是可以在departments表中插入200个唯一的部门。然而,当哈希值的个数超过了哈希键的个数,哈希聚簇的检索效率会下降。
为了说明检索的问题,假设在下图2-7的块100完全存储了部门20的行。用户要向表departments插入一个新的department_id是43的部门。部门的个数超过了HASHKEYS值,所以数据库会将department_id=43哈希成值77,他和department_id=20是相同的哈希值。将多个输入值哈希成相同的一个值被称作哈希复数。
当用户向43号部门的聚簇插入记录的时候,数据库不能将这些行存储在块100,因为他已经满了。数据库会将块100链接至一个新的溢出块,块200,将插入的行存储在这个新块中。块100和块200现在对于存储每个部门都是合适的。下面2-8图展示的,当出现哈希复数的时候,如何从哈希聚簇检索数据。图中,检索部门20或43的查询,现在都要两次I/O来提取数据:块100和他关联的块200。当然你能使用一个不同的HASHKEYS值重新创建聚簇来解决这个问题。
参考:
《Oracle Database Administrator's Guide》了解如何管理哈希聚簇的空间。