我想测试 Oracle 数据库内一组特定数据的可能压缩率,并比较这两个功能,即基本压缩和高级行压缩。
因此,我创建了两个压缩表(一个使用基本压缩,另一个使用高级行压缩)。这两种方法都尝试通过将值保存在块头内的符号表中来删除重复项。两者似乎以某种方式以相同的方式工作。我得到了压缩表的不同压缩比。使用基本压缩压缩的表比使用高级压缩压缩的表占用的空间更少。那个怎么样?有人可以向我解释一下吗?算法上肯定存在一些差异。我找不到这样的结果的原因。
您可以使用
DBMS_COMPRESSION.GET_COMPRESSION_RATIO
程序来估计压缩率,如下所示:
DECLARE
l_blkcnt_cmp PLS_INTEGER;
l_blkcnt_uncmp PLS_INTEGER;
l_row_cmp PLS_INTEGER;
l_row_uncmp PLS_INTEGER;
l_cmp_ratio NUMBER;
l_comptype_str VARCHAR2(32767);
l_index_cr DBMS_COMPRESSION.COMPRECLIST;
TYPE comptypesType IS TABLE OF INTEGER;
comptypesTable comptypesType := comptypesType(
--DBMS_COMPRESSION.COMP_BASIC,
DBMS_COMPRESSION.COMP_ADVANCED,
DBMS_COMPRESSION.COMP_QUERY_HIGH,
DBMS_COMPRESSION.COMP_QUERY_LOW,
DBMS_COMPRESSION.COMP_ARCHIVE_HIGH,
DBMS_COMPRESSION.COMP_ARCHIVE_LOW);
comptypesIndex comptypesType := comptypesType(
DBMS_COMPRESSION.COMP_INDEX_ADVANCED_HIGH,
DBMS_COMPRESSION.COMP_INDEX_ADVANCED_LOW);
BEGIN
FOR i IN comptypesTable.FIRST..comptypesTable.LAST LOOP
DBMS_COMPRESSION.GET_COMPRESSION_RATIO(
scratchtbsname => 'RADIUS_DATA',
ownname => USER,
objname => 'RADACCT_MOBILE_COMPRESS',
subobjname => NULL,
comptype => comptypesTable(i),
blkcnt_cmp => l_blkcnt_cmp,
blkcnt_uncmp => l_blkcnt_uncmp,
row_cmp => l_row_cmp,
row_uncmp => l_row_uncmp,
cmp_ratio => l_cmp_ratio,
comptype_str => l_comptype_str,
subset_numrows => DBMS_COMPRESSION.COMP_RATIO_MINROWS,
objtype => DBMS_COMPRESSION.OBJTYPE_TABLE);
DBMS_OUTPUT.PUT_LINE('----');
DBMS_OUTPUT.PUT_LINE('Number of blocks used (compressed) : ' || l_blkcnt_cmp);
DBMS_OUTPUT.PUT_LINE('Number of blocks used (uncompressed) : ' || l_blkcnt_uncmp);
DBMS_OUTPUT.PUT_LINE('Number of rows in a block (compressed) : ' || l_row_cmp);
DBMS_OUTPUT.PUT_LINE('Number of rows in a block (uncompressed) : ' || l_row_uncmp);
DBMS_OUTPUT.PUT_LINE('Compression ratio : ' || l_cmp_ratio);
DBMS_OUTPUT.PUT_LINE('Compression type : ' || l_comptype_str);
END LOOP;
END;
据我记得
DBMS_COMPRESSION.COMP_BASIC
不支持DBMS_COMPRESSION.GET_COMPRESSION_RATIO
。您可以手动压缩表/分区并比较大小。
这是一个示例结果:
----
Number of blocks used (compressed) : 640
Number of blocks used (uncompressed) : 1408
Number of rows in a block (compressed) : 203
Number of rows in a block (uncompressed) : 92
Compression ratio : 2.2
Compression type : "Compress Advanced"
----
Number of blocks used (compressed) : 1583
Number of blocks used (uncompressed) : 10837
Number of rows in a block (compressed) : 632
Number of rows in a block (uncompressed) : 92
Compression ratio : 6.8
Compression type : "Compress Query High"
----
Number of blocks used (compressed) : 2611
Number of blocks used (uncompressed) : 10837
Number of rows in a block (compressed) : 383
Number of rows in a block (uncompressed) : 92
Compression ratio : 4.1
Compression type : "Compress Query Low"
----
Number of blocks used (compressed) : 1560
Number of blocks used (uncompressed) : 10837
Number of rows in a block (compressed) : 641
Number of rows in a block (uncompressed) : 92
Compression ratio : 6.9
Compression type : "Compress Archive High"
----
Number of blocks used (compressed) : 1501
Number of blocks used (uncompressed) : 10837
Number of rows in a block (compressed) : 666
Number of rows in a block (uncompressed) : 92
Compression ratio : 7.2
Compression type : "Compress Archive Low"
----
您获得的压缩率取决于表中的数据结构。行或列中是否有许多不同的值,这也取决于数据类型。