。
表压缩 数据库能使用表压缩来降低存储空间。压缩技术可以节省磁盘空间,降低数据库buffer cache的内存使用量,在一些场景下,还会提高检索执行的速度。表压缩对数据库应用来说是透明的。
基础和OLTP表压缩
基于数据字典的表压缩为堆表提供了良好的压缩率。Oracle数据库支持以下几种基于数据字典的表压缩类型。
1. 基础表压缩
这种类型的压缩适用于批量加载的操作。数据库不会压缩使用传统DML修改的数据。你必须使用直接路径加载,ALTER TABLE ... MOVE操作,或者在线重定义来实现基础压缩。
2. OLTP表压缩
这种类型的压缩适用于OLTP应用,任何SQL操作都能控制压缩数据。
对于基础和OLTP表压缩,数据库会以行格式存储压缩的行。一行的所有列会存储在一起,紧接着是下一行的所有列,如图所示,
重复的值会在数据块的开始用一个短小的指向表的引用所替代。因此,解压缩数据所需的信息会存储在数据块当中。
压缩的数据块更像是普通的数据块。大多能应用在数据块的数据库特性和功能同样能应用在压缩数据块。
可以在表空间、表、分区或子分区层面指定压缩。如果在表空间上指定压缩,那么在表空间中创建的所有表都会默认采用压缩。
下面语句会在orders表上应用OLTP压缩:
下面的示例,是在CREATE TABLE语句中为一个分区指定OLTP压缩,为其他分区指定基础压缩:
参考:
"Data Block Compression"章节,了解关于压缩数据块的格式。
《Oracle Database Administrator's Guide》和《Oracle Database Performance Tuning Guide》了解关于表压缩的信息。
"SQL*Loader"章节了解使用SQL*Loader用于直接路径加载的操作。
混合列压缩
混合列压缩,数据库会为一组行存储相同的列。数据块不会以行格式存储数据,但会使用行和列的混合模式进行存储。
将相同数据类型和相近特征的列数据存储在一起,通过这种压缩能极大提升磁盘节省的空间。即使压缩级别比直接路径加载还要高,任何SQL操作都能控制压缩的数据。数据库对压缩对象的操作都是透明的,因此不需要应用做任何改动。
混合列压缩的类型
如果你的底层存储支持混合列压缩,根据需求,你就能指定如下的压缩类型。
1. 数据仓库压缩
这种类型的压缩为节省磁盘空间做了优化,适用于数据仓库的应用。
2. 在线归档压缩
这种类型的压缩是最大比例的压缩级别,适用于历史数据以及不会改动的数据。
使用数据仓库或者在线归档压缩,必须使用直接路径加载,ALTER TABLE ... MOVE操作,或者在线重定义。
混合列压缩为Exadata一体机存储上的数据仓库以及决策支持系统做了优化。Exadata最大化了使用混合列压缩的表检索性能,充分利用了集成到Exadata存储服务器上的处理器、内存和高速网络带宽。
其他的Oracle存储系统支持混合列压缩,能节省和Exadata存储相同的磁盘空间,但是不能提供相同级别的检索性能。对于这些存储系统来说,混合列压缩适用于数据库内部不经常访问的旧数据归档。
压缩单元
混合列压缩使用叫做压缩单元的逻辑结构存储一组行。当你将数据加载到表中,数据库会以列格式存储一组行,包括每个存储和压缩在一起的列。在数据库压缩了行列数据后,数据库会将数据放入相应的压缩单元中。
例如,你对一张daily_sales表应用了混合列压缩。每天晚上,会向表中导入销售数据,包括商品ID和日期组成的复合主键。下表展示了daily_sales的一些行数据,
假设上表中的行存储在一个压缩单元。混合列压缩会将每个列值存储在一起,然后使用多个算法来压缩每一列。数据库会基于很多因素选择算法,包括列的数据类型,列中实际值的势,以及用户选择的压缩级别。
如下面的图展示,每个压缩单元能跨越多个数据块。一个特定列的值,可能跨越多个数据块,当然也可能不会跨越多个数据块。
混合列压缩会有隐式行锁(参考"Row Locks (TX)"章节)。当更新一个非压缩的数据块时,仅会锁定这些更新的行。比较而言,如果更新压缩单元中任意的行,数据块必须锁定压缩单元中所有的行。使用混合压缩列的更新行操作会改变rowid。
注意:
当使用混合列压缩的表,Oracle的DML会锁定更多的数据块(压缩单元),就会降低并发。
参考:
《Oracle Database Licensing Information》了解使用混合列压缩的许可。
《Oracle Database Administrator's Guide》了解如何使用混合列压缩。