Oracle中数据压缩功能小结(二)

2014-11-24 10:35:42 · 作者: · 浏览: 3

\

不像传统的数据存储,一行中所有的信息都存放在一起。而是使用CU(CompressionUnit)的结构来存储数据,将一组(很多行)行中每列的信息存放在一起,然后执行压缩操作。可以节省更多的空间。(原来只是块内引用,现在是多块内引用,肯定节省更多的空间)但是同样的,由于这种存储结构,在发生更新1行的数据的时候,会连带的锁定一个Logical Compression Unit中的所有行。

我不是OracleDatabase的销售,所以关于HCC的内容就介绍到这里。

最后说一下关于压缩的几点限制:

1. compress Basic和compress for oltp 不支持超过255列的信息。(真心蛋疼,难道是因为超过255列的row会跨越多个row piece的原因?)

2. BasicFile LOBs 不支持压缩,SecureFile LOBs支持压缩。(新东西带来新bug)

3. 使用compress basic的时候无法drop column,但是对于compress for oltp以及hcc中的各种压缩格式是允许的。

4. 不支持索引组织表。

5. 不支持外部表或者cluster table(直接说只支持堆积表得了)。

HCC的限制内容不描述了。‘

下面附上show_space(itpub改良版)脚本:

CREATE OR REPLACE PROCEDURE show_space(p_segname_1 IN VARCHAR2,
p_type_1 IN VARCHAR2 DEFAULT 'TABLE',
p_space IN VARCHAR2 DEFAULT 'AUTO',
p_analyzed IN VARCHAR2 DEFAULT 'N',
p_partition_1 IN VARCHAR2 DEFAULT NULL,
p_owner_1 IN VARCHAR2 DEFAULT USER)
AUTHID CURRENT_USER AS
p_segname VARCHAR2(100);
p_type VARCHAR2(30);
p_owner VARCHAR2(30);
p_partition VARCHAR2(50);

l_unformatted_blocks NUMBER;
l_unformatted_bytes NUMBER;
l_fs1_blocks NUMBER;
l_fs1_bytes NUMBER;
l_fs2_blocks NUMBER;
l_fs2_bytes NUMBER;
l_fs3_blocks NUMBER;
l_fs3_bytes NUMBER;
l_fs4_blocks NUMBER;
l_fs4_bytes NUMBER;
l_full_blocks NUMBER;
l_full_bytes NUMBER;

l_free_blks NUMBER;
l_total_blocks NUMBER;
l_total_bytes NUMBER;
l_unused_blocks NUMBER;
l_unused_bytes NUMBER;
l_LastUsedExtFileId NUMBER;
l_LastUsedExtBlockId NUMBER;
l_LAST_USED_BLOCK NUMBER;

PROCEDURE p(p_label IN VARCHAR2, p_num IN NUMBER) IS
BEGIN
DBMS_OUTPUT.put_line(RPAD(p_label, 40, '.') || p_num);
END;
BEGIN
p_segname := UPPER(p_segname_1);
p_owner := UPPER(p_owner_1);
p_type := p_type_1;
p_partition := UPPER(p_partition_1);

IF (p_type_1 = 'i' OR p_type_1 = 'I') THEN
p_type := 'INDEX';
END IF;

IF (p_type_1 = 't' OR p_type_1 = 'T') THEN
p_type := 'TABLE';
END IF;

IF (p_type_1 = 'tp' OR p_type_1 = 'TP') THEN
p_type := 'TABLE PARTITION';
END IF;

IF (p_type_1 = 'ip' OR p_type_1 = 'IP') THEN
p_type := 'INDEX PARTITION';
END IF;

IF (p_type_1 = 'c' OR p_type_1 = 'C') THEN
p_type := 'CLUSTER';
END IF;

DBMS_SPACE.UNUSED_SPACE(segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
partition_name => p_partition,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK);

IF p_space = 'MANUAL' OR (p_space <> 'auto' AND p_space <> 'AUTO') THEN
DBMS_SPACE.FREE_BLOCKS(segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
partition_name => p_partition,
freelist_group_id => 0,
free_blks => l_free_blks);

p('Free Blocks', l_free_blks);
END IF;

p('Total Blocks', l_total_blocks);
p('Total Bytes', l_total_bytes);
p('Unused Blocks', l_unused_blocks);
p('Unused Bytes', l_unused_bytes);
p('Last Used Ext FileId', l_LastUsedExtFileId);
p('Last Used Ext BlockId', l_LastUsedExtBlockId);
p('Last Used Block', l_LAST_USED_BLOCK);

/*IF the segment is analyzed */
IF p_analyzed = 'Y' THEN
DBMS_SPACE.SPACE_USAGE(segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
partition_name => p_partition,
unformatted_blocks => l_unformatted_blocks,
unformatted