这是杂货铺的第462篇文章
背景:
按照《Oracle Conecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。
前言《Introduction to Oracle Database》的历史文章:
第二章《Tables and Table Clusters》 历史文章:
本文主题:第二章《Tables and Table Clusters》 - Overview of Tables,以下是12c内容补充。
12c的《Concept》在这章中,新增了属性聚簇表的介绍。
属性聚簇表概述
属性聚簇表是一张堆表,基于用户指定的聚簇指令,会将这些数据存储在磁盘中相近的位置。如下指令会指定使用单表还是多表的列。
CLUSTERING ... BY LINEAR ORDER指令会根据指定的列对表中数据进行排序。当检索条件符合聚簇子句中指定的列前缀,可以考虑使用默认的LINEAR ORDER聚簇。例如,如果sh.sales的检索经常指定一个客户的ID或者客户和产品ID,就可以在表中使用复合列cust_id和prod_id来聚簇数据。
CLUSTERING ... BY INTERLEAVED ORDER指令会使用特殊的算法(类似一个Z排序函数)对一张或多张表进行排序,能降低多列I/O消耗。当检索很多混合列的时候,可以考虑使用INTERLEAVED ORDER聚簇。例如,如果检索sh.sales按照不同的顺序指定不同的维度,就可以在这些维度中根据列来聚簇sales的数据。
只有在直接路径INSERT操作中才能使用属性聚类。对于传统DML语句,无法使用属性聚类的操作。
下面的章节会包含如下主题:
属性聚簇表的优点
连接属性聚簇表
使用区对I/O的降低
使用LINEAR ORDER的属性聚簇表
使用INTERLEAVED ORDER的属性聚簇表
属性聚簇表的优点
属性聚簇表的主要优点就是I/O的降低,他会显著降低表扫描的I/O成本和CPU成本。I/O的降低主要发生在区中,或者通过将聚簇的值存储在物理上比较接近的位置来降低物理I/O。
属性聚簇表会有以下优点:
可以基于星型模式的维度列对事实表进行聚簇。在星型模式中,大多数查询会用到维度表,而不是事实表,因此聚簇事实表的列不会有效。Oracle数据库支持对维度表的列进行聚簇。
在如下这些场景中能降低I/O:
当使用Oracle Exadata一体机的索引、In-Memory最小/最大剪裁、或者区映射。
在OLTP应用中,使用linear order的属性聚簇且满足前缀要求的检索中。
使用INTERLEAVED ORDER的聚簇列子集。
属性聚簇能提升数据压缩,间接提高了表扫描的成本。当同一个值在磁盘上相邻存储,数据库就能更容易地对他们进行压缩。当啊
Oracle数据库不会影响索引的存储和维护成本。
可以参考:
《Oracle Database Data Warehousing Guide》可以了解更多关于属性聚簇表的优点。
连接属性聚簇表
基于连接列的属性聚簇被称作属性聚簇表。和表聚簇相比,连接属性聚簇表不会在相同的数据块中存储来自于不同表的数据。
例如,一张属性聚簇表sales,和一张维度表连接products。sales表只会包含来自sales表的行,不会存储基于列的值和products连接得到的结果集。在数据迁移、直接路径插入、以及CTAS操作中会执行合适的连接操作。比较而言,如果sales和products都是标准的表聚簇,数据块就会包含来自于这两张表的行。
可以参考:
《Oracle Database Data Warehousing Guide》可以了解关于连接属性聚簇的信息。