基本和高级压缩(压缩差异)

问题描述 投票:0回答:1

我想测试 Oracle 数据库内一组特定数据的可能压缩率,并比较这两个功能,即基本压缩和高级行压缩。

因此,我创建了两个压缩表(一个使用基本压缩,另一个使用高级行压缩)。这两种方法都尝试通过将值保存在块头内的符号表中来删除重复项。两者似乎以某种方式以相同的方式工作。我得到了压缩表的不同压缩比。使用基本压缩压缩的表比使用高级压缩压缩的表占用的空间更少。那个怎么样?有人可以向我解释一下吗?算法上肯定存在一些差异。我找不到这样的结果的原因。

oracle compression
1个回答
0
投票

您可以使用

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"

----

您获得的压缩率取决于表中的数据结构。行或列中是否有许多不同的值,这也取决于数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.