ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle 10g数据表压缩的一些细节(下)

Oracle 10g数据表压缩的一些细节(下)

原创 Linux操作系统 作者:realkid4 时间:2012-03-26 22:38:25 0 删除 编辑

 

下面我们通过几个极端情况实验,继续分析10gR2Compression

 

3、极端情况实验(1

 

那么,上面我们验证数据compress选项切换无效,是不是和我们已经分配过的记录有关系呢?我们首先建立一张空表。

 

 

SQL> create table t_sample1 as select * from t_source where 1=0;

Table created

 

SQL>  exec dbms_stats.gather_table_stats(user,'T_SAMPLE1',cascade => true);

PL/SQL procedure successfully completed

 

SQL> select HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS, EXTENTS from dba_segments where wner='SCOTT' and segment_name='T_SAMPLE1';

 

HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS

----------- ------------ ---------- ---------- ----------

          4         4139      65536          8          1

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_SAMPLE1';

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

         0          0 DISABLED

 

 

我们创建空表,没有记录,但是默认有一个分区分配过来。

 

 

SQL> alter table t_sample1 compress;

Table altered

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_SAMPLE1';

 

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

         0          0 ENABLED

 

SQL> insert into t_sample1 select * from t_source;

1367 rows inserted

 

SQL> commit;

Commit complete

 

SQL>  exec dbms_stats.gather_table_stats(user,'T_SAMPLE1',cascade => true);

PL/SQL procedure successfully completed

 

SQL> select HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS, EXTENTS from dba_segments where wner='SCOTT' and segment_name='T_SAMPLE1';

HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS

----------- ------------ ---------- ---------- ----------

          4         4139     196608         24          3

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_SAMPLE1';

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

      1367         20 ENABLED

 

 

依然是使用三个分区,依然是没有进行压缩。

 

 

SQL> alter table t_sample1 move;

 

Table altered

 

SQL> exec dbms_stats.gather_table_stats(user,'T_SAMPLE1',cascade => true);

 

PL/SQL procedure successfully completed

 

SQL> select HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS, EXTENTS from dba_segments where wner='SCOTT' and segment_name='T_SAMPLE1';

 

HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS

----------- ------------ ---------- ---------- ----------

          4         4187     131072         16          2

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_SAMPLE1';

 

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

      1367         11 ENABLED

 

 

结论:即使没有一行数据插入的情况下,我们使用compress的数据表,利用OLTP方式插入,也不能实现压缩。依然需要手工的压缩过程。

 

 

4、极端情况实验(2

 

对实验数据表t_sample1继续插入数据时,新分配的数据块是可能应用压缩格式的。

 

 

SQL> insert into t_sample1 select * from t_source;

1367 rows inserted

 

SQL> commit;

Commit complete

 

 

此时,数据行会出现部分压缩的现象。

 

 

SQL> exec dbms_stats.gather_table_stats(user,'T_SAMPLE1',cascade => true);

PL/SQL procedure successfully completed

 

SQL> select HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS, EXTENTS from dba_segments where wner='SCOTT' and segment_name='T_SAMPLE1';

HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS

----------- ------------ ---------- ---------- ----------

          4         4187     262144         32          4

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_SAMPLE1';

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

      2734         31 ENABLED

 

SQL> select dbms_rowid.rowid_relative_fno(rowid) fno, dbms_rowid.rowid_block_number(rowid) bno, count(*) from t_sample1 group by dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) order by bno;

 

       FNO        BNO   COUNT(*)

---------- ---------- ----------

         4       4138         83

         4       4139         85

         4       4140         83

         4       4141         81

         4       4142         84

         4       4143         79

         4       4144         79

         4       4148         83

         4       4149         83

         4       4150         88

         4       4151         88

         4       4152         27

         4       4188        193

         4       4189        184

         4       4190        184

         4       4191        177

         4       4192        188

         4       4193        199

         4       4194        199

         4       4195         43

         4       4196         84

         4       4197         82

         4       4198         86

         4       4199         82

         4       4200         90

 

25 rows selected

 

 

在我们持续增加数据的时候,会出现一定的压缩情况。

 

 

SQL> alter table t_sample1 move;

Table altered

 

SQL> exec dbms_stats.gather_table_stats(user,'T_SAMPLE1',cascade => true);

PL/SQL procedure successfully completed

 

SQL> select HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS, EXTENTS from dba_segments where wner='SCOTT' and segment_name='T_SAMPLE1';

HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS

----------- ------------ ---------- ---------- ----------

          4         4211     196608         24          3

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_SAMPLE1';

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

      2734         19 ENABLED

 

SQL> select dbms_rowid.rowid_relative_fno(rowid) fno, dbms_rowid.rowid_block_number(rowid) bno, count(*) from t_sample1 group by dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) order by bno;

 

       FNO        BNO   COUNT(*)

---------- ---------- ----------

         4       4212        193

         4       4213        184

         4       4214        184

         4       4215        177

         4       4216        188

         4       4225        199

         4       4226        199

         4       4227        191

         4       4228        191

         4       4229        178

         4       4230        198

         4       4231        174

         4       4232        185

         4       4490        199

         4       4491         94

 

15 rows selected

 

 

通过move过程,实现完全压缩。

 

5、实现压缩的insert方式

 

从上面一系列实验中,我们可以看出Oracle 10g CompressionOLTP方式插入数据压缩效果较差。但是,在进行Direct Insert方法的时候,Compression的效果是可以的。

 

 

SQL> create table t_source as select * from dba_objects where wner='SYS';

Table created

 

SQL>  exec dbms_stats.gather_table_stats(user,'T_SOURCE',cascade => true);

PL/SQL procedure successfully completed

 

SQL> select HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS, EXTENTS from dba_segments where wner='SCOTT' and segment_name='T_SOURCE';

 

HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS

----------- ------------ ---------- ---------- ----------

          4         5395    3145728        384         18

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_SOURCE';

 

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

     22946        327 DISABLED

 

 

新原数据表没有压缩,共占用384个块,18extent分区。下面建立一个新的数据表t_compress,采用压缩配置。

 

--建立空数据表;

SQL> create table t_compress as select * from dba_objects where 1=0;

Table created

 

SQL>  exec dbms_stats.gather_table_stats(user,'T_COMPRESS',cascade => true);

PL/SQL procedure successfully completed

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_COMPRESS';

 

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

         0          0 DISABLED

 

 

开启压缩选项。

 

 

SQL> alter table t_compress compress;

Table altered

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_COMPRESS';

 

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

         0          0 ENABLED

 

 

之后采用direct insert方式插入数据。

 

 

SQL> insert /*+append */into t_compress select * from t_source;

22946 rows inserted

 

SQL> commit;

Commit complete

 

SQL>  exec dbms_stats.gather_table_stats(user,'T_COMPRESS',cascade => true);

PL/SQL procedure successfully completed

 

 

SQL> select NUM_ROWS, BLOCKS, Compression from dba_tables where wner='SCOTT' and table_name='T_COMPRESS';

 

  NUM_ROWS     BLOCKS COMPRESSION

---------- ---------- -----------

     22946        139 ENABLED

 

SQL> select HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS, EXTENTS from dba_segments where wner='SCOTT' and segment_name='T_COMPRESS';

 

HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS

----------- ------------ ---------- ---------- ----------

          4         6835    2097152        256         17

 

 

可见,10R2中,压缩主要是针对那些稳定数据。如果操作是频繁的增加修改和删除的OLTP操作,压缩是不进行或者效果很差的。

 

6、结论

 

从上面的实验中,我们可以看出:Oracle 10R2中的压缩技术主要是针对稳定数据表而言的。如果数据表很大,而且不会频繁的进行增加修改和删除操作,我们推荐使用压缩功能。如果我们对一个压缩表进行OLTP方式操作,压缩效应是不明显的。只有在Direct Insert等特殊的操作中,压缩才能体现出来。

 

Oracle 11g带给我们的Advanced Compression新特性,其中的Compression For OLTP在一定程度上缓解了这个难题。

 

再次说明,我们的解决方案,要依据版本、效果和特性进行。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-719588/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7546325