1 表压缩方法概览
Oracle数据库支持三种表压缩方法:
基本表压缩
advanced行压缩
混合柱状压缩(与Exadata)
Oracle公司建议压缩所有数据以降低存储成本。Oracle数据库服务器可以使用表压缩来消除数据块中的重复值。对于具有高度冗余数据的表,压缩可以节省磁盘空间并减少数据库缓冲区缓存中的内存使用。表压缩对数据库应用程序是透明的。
table_compression子句仅对堆组织的表有效。关键字COMPRESS支持表压缩。NOCOMPRESS关键字禁用表压缩。NOCOMPRESS是默认值。
使用基本压缩:Oracle数据库服务器在执行批量加载时使用直接加载或CREATE TABLE as SELECT等操作压缩数据。
使用行存储压缩高级功能,Oracle数据库服务器在对表的所有DML操作期间对数据进行压缩。
2 COMPRESS BASIC
使用COMPRESS或COMPRESS BASIC,可以启用基本表压缩。
语法:
CREATE TABLE … COMPRESS BASIC …;
Oracle数据库服务器在以下直接路径插入操作中尝试压缩数据:
Direct-path SQL*Loader
CREATE TABLE AS SELECT statements
Parallel INSERT statements
INSERT statements with an APPEND hint
原始导入程序(imp)不支持直接路径插入,因此不能以压缩格式导入数据。
在早期版本中,这种类型的压缩称为DSS表压缩,并通过COMPRESS FOR DIRECT_LOAD OPERATIONS启用。此语法已被弃用。
压缩消除了由于删除而创建的孔洞,并最大化使块中的空闲空间连续。
如上图,开始时,块是空的,可以用于插入。当开始插入到此块时,数据将以未压缩格式存储(对于未压缩的表)。然而,一旦达到块的PCTFREE的值填充了块,就会自动压缩数据,从而可能减少它最初占用的空间。这样再次允许在相同的块中进行新的未压缩插入,直到根据PCTFREE设置再次填充该块为止。此时,将再次触发压缩,以减少块中使用的空间量。
注意:使用COMPRESS或COMPRESS BASIC的表使用PCTFREE值0来最大化压缩,除非显式地为PCTFREE子句设置了一个值。
带有行存储库COMPRESS ADVANCED或NOCOMPRESS的表使用PCTFREE默认值10来最大化压缩,同时仍然允许对数据进行一些未来的DML更改,除非显式地重写这个默认值。
3 ROW STORE COMPRESS ADVANCED
使用高级行存储压缩,可以启用高级行压缩。
语法:
CREATE TABLE … ROW STORE COMPRESS ADVANCED …;
Oracle数据库在对表的所有DML操作期间压缩数据。建议在活动OLTP环境中使用这种压缩形式。
在早期版本中,COMPRESS FOR ALL OPERATIONS and COMPRESS FOR OLTP。此语法已被弃用。
使用高级行压缩,数据块中的行和列中的重复值在符号表中块的开始处存储一次。重复的值被替换为对符号表的简短引用。
为了说明高级行压缩的原理,图表显示了两个矩形。第一个灰色矩形包含四个标为“G”的绿色小方块和六个标为“Y”的黄色方块。它们代表未压缩的块。在第二个灰色矩形的开始部分,只有一个标为“G”的绿色正方形和一个标为“Y”的黄色正方形,它们代表符号表。第二个灰色图显示了10个与绿色和黄色方块在相同位置的白色方块。它们是白色的,因为它们现在只是一个参考引用,重复的值不再占用空间。
4 表压缩使用的场景限制
可以指定表压缩的场景:
对于整个堆组织的表(在physical_properties clause of relational_table or object_table)
对于分区表(每个分区可以有不同类型或级别的压缩)。
用于存储嵌套表(在nested_table_col_properties clause)
表压缩有以下限制:
对于列数超过255的表,不支持高级行存储压缩和基本压缩。
不能将使用直接加载操作压缩数据的表中的列删除,但可以将这样的列设置为未使用。在OLTP环境中,ALTER TABLE … drop_column_clause 语句对于压缩了的表是有效的。也就是使用了advance row compressed压缩的表可以删除列。
5 压缩建议顾问
Compression Advisor:
压缩顾问分析数据库对象,并确定每个压缩级别可以达到的预期压缩比。分析对象以估计不同压缩方法节省的空间
有助于为应用程序确定正确的压缩级别
推荐各种压缩策略
为特定的数据集选择正确的压缩算法
对特定列进行排序,以提高压缩比
介绍了不同压缩算法之间的权衡
为OLTP压缩工作(通过企业管理器)
因此,它可以帮助确定应用程序的适当压缩级别。该顾问推荐了各种压缩策略。当从Enterprise Manager访问它时,它决定了OLTP压缩。
6 DBMS_COMPRESSION包
由DBMS_COMPRESSION包提供的压缩顾问可以帮助确定指定表的压缩比。advisor分析数据库中的对象,发现可能实现的压缩比,并推荐最佳压缩级别。除了DBMS_COMPRESSION包之外,压缩顾问还可以在现有的advisor框架中使用(如:使用DBMS_ADVISOR包)。
为了确定压缩比,DBMS_COMPRESSION包有以下子程序:
GET_COMPRESSION_RATIO过程提供未压缩表的可能压缩比。
GET_COMPRESSION_TYPE函数返回给定行的压缩类型。
如:
BEGIN
DBMS_COMPRESSION.GET_COMPRESSION_RATIO (‘USERS’,‘SH’,‘SALES’,
NULL,DBMS_COMPRESSION.COMP_FOR_OLTP, blkcnt_cmp, blkcnt_uncmp,
rowcnt_cmp, rowcnt_uncmp, comp_ration, comptype);
DBMS_OUTPUT.PUT_LINE('Blk count compressed = ’ || blkcnt_cmp);
DBMS_OUTPUT.PUT_LINE('Blk count uncompressed = ’ || blkcnt_uncmp);
DBMS_OUTPUT.PUT_LINE('Row count per block compressed = ’ || rowcnt_cmp);
DBMS_OUTPUT.PUT_LINE('Row count per block uncompressed = ’ || rowcnt_uncmp);
DBMS_OUTPUT.PUT_LINE('Compression type = ’ || comptype);
DBMS_OUTPUT.PUT_LINE(‘Compression ratio = ‘||comp_ratio||’ to 1’);