某个分区的数据是否被压缩了

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

此查询将告诉我压缩是否已标记为压缩

Select *
From All_Tab_Partitions

在讨论中提出,如果使用 FAST_LOAD 加载,标记为压缩的分区实际上可以包含未压缩的数据。

我只想对未压缩的分区发出压缩命令。

如何查看分区内的数据是否被压缩?

oracle compression partitioning
1个回答
1
投票

基本压缩可以在分区上“启用”,但仅当数据是从直接路径插入创建时才“使用”。直接路径插入不是默认的插入类型;它们通常需要额外的代码,例如像/*+ APPEND */这样的提示,或者在第三方数据加载应用程序中设置选项。您可能需要对对象进行一些更改以启用直接路径写入,例如禁用触发器和一些外键。因此,启用可以利用基本压缩优势的直接路径插入并不总是可行的,甚至是不可取的。 使用采样和函数

DBMS_COMPRESSION.GET_COMPRESSION_TYPE
估计行的百分比 每个分区都压缩。

架构

create table compression_test ( a number, b varchar2(100) ) partition by range(a) ( partition p_all_compressed values less than (2) compress, partition p_none_compressed values less than (3) compress, partition p_half_compressed values less than (4) compress ); insert /*+ append */ into compression_test partition (p_all_compressed) select 1, '0123456789' from dual connect by level <= 100000; commit; insert into compression_test partition (p_none_compressed) select 2, '0123456789' from dual connect by level <= 100000; commit; insert /*+ append */ into compression_test partition (p_half_compressed) select 3, '0123456789' from dual connect by level <= 50000; commit; insert into compression_test partition (p_half_compressed) select 3, '0123456789' from dual connect by level <= 50000; commit;

预估代码

--Find percent compressed from sampling each partition. declare v_percent_compressed number; begin --Loop through partitions. for partitions in ( select table_owner, table_name, partition_name from dba_tab_partitions --Enter owner and table_name here. where table_owner = user and table_name = 'COMPRESSION_TEST' ) loop --Dynamic SQL to sample a partition and test for compression. execute immediate ' select round(sum(is_compressed)/count(is_compressed) * 100) percent_compressed from ( --Compression status of sampled rows. -- --Numbers are based on constants from: --docs.oracle.com/cd/E16655_01/appdev.121/e17602/d_compress.htm --Assumption: Only basic compression is used. --Assumption: Partitions are large enough for 0.1% sample size. select case dbms_compression.get_compression_type( user, '''||partitions.table_name||''', rowid, '''||partitions.partition_name||''' ) when 4096 then 1 when 1 then 0 end is_compressed from '||partitions.table_owner||'.'||partitions.table_name||' partition ('||partitions.partition_name||') sample (0.1) ) ' into v_percent_compressed; dbms_output.put_line(rpad(partitions.partition_name||':', 31, ' ')|| lpad(v_percent_compressed, 3, ' ')); end loop; end; /

示例输出

P_ALL_COMPRESSED: 100 P_HALF_COMPRESSED: 55 P_NONE_COMPRESSED: 0

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