Oracle 10g資料表壓縮的一些細節(下)
下面我們透過幾個極端情況實驗,繼續分析10gR2的Compression。
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 Compression對OLTP方式插入資料壓縮效果較差。但是,在進行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個塊,18個extent分割槽。下面建立一個新的資料表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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 的表壓縮Oracle
- oracle壓縮表(二)Oracle
- oracle壓縮表(一)Oracle
- linux 下壓縮與解壓資料夾Linux
- Linux下解壓命令、壓縮命令大全,詳細教程Linux
- 【SHRINK】Oracle收縮表的詳細命令參考Oracle
- Oracle 10g 增刪節點Oracle 10g
- linux下壓縮解壓縮命令Linux
- MySQL 5.6的表壓縮MySql
- Linux下的tar壓縮解壓縮命令詳解Linux
- Oracle案例11——Oracle表空間資料庫檔案收縮Oracle資料庫
- Oracle 10g 下載地址Oracle 10g
- 簡單瞭解一下壓縮表
- oracle 10g建立資料庫鏈的簡化Oracle 10g資料庫
- 在 Spark 資料匯入中的一些實踐細節Spark
- 壓縮資料以節省空間和提高速度(轉)
- Windows的壓縮資料夾(zip/cab)Windows
- 0910 – iPaste 搞定資料壓縮AST
- Oracle 資料庫 10g中的分割槽功能(轉)Oracle資料庫
- Oracle 10g RAC 資料儲存更換Oracle 10g
- Linux下檔案的壓縮與解壓Linux
- for 迴圈的一些細節
- Termux使用的一些細節UX
- 壓縮錶轉非壓縮表(線上重定義)
- Sqlserver表和索引壓縮SQLServer索引
- MYSQL壓縮表測試MySql
- 高效的資料壓縮編碼方式 Protobuf
- linux下壓縮、解壓命令大全Linux
- Java實現壓縮資料夾Java
- Hadoop(十九)MapReduce OutputFormat 資料壓縮HadoopORM
- 初學Golang的一些細節Golang
- 解析ws訂閱返回的GZIP 壓縮資料
- 關於資料庫壓縮技術的Survey資料庫
- 怎麼把資料夾壓縮成壓縮包發給微信好友
- Redis 的基礎資料結構(二) 整數集合、跳躍表、壓縮列表Redis資料結構
- kotlin對ZipInputStream與ZipOutputStream的一些擴充工具(壓縮,解壓)Kotlin
- openGauss 支援OLTP場景資料壓縮
- Linux加密壓縮檔案/資料夾Linux加密
- 序列化資料傳輸壓縮