Oracle 10g資料表壓縮的一些細節(下)

realkid4發表於2012-03-26

 

下面我們透過幾個極端情況實驗,繼續分析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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章