資料表建立引數介紹(二)

realkid4發表於2011-02-27

 

ü        COMPRESS壓縮引數

 

Compress引數含義很清楚:就是在儲存資料表資料的時候是否啟用壓縮選項。壓縮使用的級別是資料塊block級別。Oracle對資料塊的壓縮採用相鄰相同值合併的壓縮演算法。

 

Compress引數有兩個系列引數:

 

1、OMPRESS FOR DIRECT_LOAD OPERATIONS:作用於Compress相同,適合於資料倉儲OLAP系統。只在直接插入過程中在表或者分割槽上啟用壓縮技術;

2、COMPRESS FOR ALL OPERATIONS:適合於OLTP系統,針對所有的操作均啟用了壓縮選項。要求的版本較高。

 

下面,我們透過一個小實驗,來確定壓縮效果。首先,構建兩個資料表test和test1,資料量和順序相同,只是引數不同。

 

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

 

SQL> set timing on;

SQL> create table test nocompress as select * from all_objects where 1=0;

Table created

Executed in 0.11 seconds

 

SQL> insert /*+append */ into test select * from all_objects;

40724 rows inserted

(提交和重複執行該語句,篇幅原因省略

 

SQL> insert into test  select * from test;

122170 rows inserted

Executed in 8.412 seconds

 

SQL> select count(*) from test;

  COUNT(*)

----------

    244340

Executed in 0.872 seconds

 

SQL> exec dbms_stats.gather_table_stats('SCOTT','TEST',cascade => true);

PL/SQL procedure successfully completed

Executed in 2.354 seconds

 

//壓縮資料表

SQL> create table test1 compress as select * from all_objects where 1=0;

Table created

Executed in 0.17 seconds

 

SQL> insert /*+append */ into test1 select * from all_objects;

40724 rows inserted

Executed in 2.724 seconds

(提交和重複執行該語句,篇幅原因省略

 

SQL> insert into test1  select * from test1;

122172 rows inserted

Executed in 1.562 seconds

 

SQL> commit;

Commit complete

Executed in 0.03 seconds

SQL> select count(*) from test1;

 

  COUNT(*)

----------

    244344

 

Executed in 0.03 seconds

 

SQL> exec dbms_stats.gather_table_stats('SCOTT','TEST1',cascade => true);

 

PL/SQL procedure successfully completed

 

Executed in 0.501 seconds

 

 

兩個資料表資料量和結構完全相同,內容也相同。經過分析後,我們檢查資料字典反應的情況。

 

SQL> select segment_name, segment_type, bytes/1024/1024 MB, blocks, extents from user_segments where  segment_name in ('TEST','TEST1');

 

SEGMENT_NA SEGMENT_TY         MB     BLOCKS    EXTENTS

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

TEST1      TABLE              17       2176         32

TEST       TABLE              28       3584         43

 

Executed in 0.08 seconds

 

 

結果很清楚了,在沒有使用壓縮技術的TEST資料表,佔有空間28MB,共3584個資料塊。而採用過資料庫壓縮技術後,空間使用到了17MB,共2176個資料塊,空間節省39%左右。

 

進一步實驗,根據Oracle壓縮的方法,我們嘗試將近似的行之間相同資料情況增加。all_objects檢視中,owner和object_type相似度較高,選擇性低,這樣我們組織資料形態。

 

//構建實驗資料表三

SQL> create table test2 compress as select * from test1 order by owner,object_type;

 

Table created

Executed in 5.719 seconds

 

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

 

PL/SQL procedure successfully completed

Executed in 1.102 seconds

 

SQL> select segment_name, segment_type, bytes/1024/1024 MB, blocks, extents from user_segments where  segment_name in ('TEST','TEST1','TEST2');

 

SEGMENT_NA SEGMENT_TY         MB     BLOCKS    EXTENTS

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

TEST1      TABLE              17       2176         32

TEST       TABLE              28       3584         43

TEST2      TABLE              10       1280         25

 

Executed in 0.08 seconds

 

 

按照演算法特徵進行整理之後,資料表大小便為了10M,壓縮率提高到了64%。

 

ü        LOGGING:日誌記錄

LOGGING參數列示對資料表或者其他物件進行變化性操作的時候,是否計入到REDO日誌中。預設情況下,Oracle對資料庫物件的任何修改性操作都會計入到redo log中,作為資料庫恢復使用。開啟logging功能,是保證資料庫資料一致性的重要一步。

 

有一些時候,我們可能會不希望記日誌操作。因為logging的時候會存在相當的效能損失,為了避免這種損失,加快操作速度,我們可能會選擇暫時性的設定資料表為nologging狀態。比如,我們在進行大規模資料載入的時候,可能就會選擇這種方式。

 

 

先不論nologging的好壞,有幾個問題筆者需要說明。首先,啟用資料表的nologging絕不意味著說一點重做日誌都不書寫。在執行過程中,資料表對應的索引物件等內容,都有一個重建的過程,這個過程是需要寫入redo log的。第二,不啟用redo log,的確會帶來一定的效能提升。但是沒有日誌的資料庫是極其危險的,一旦發生例項崩潰或者資料庫崩潰這種情況,資料庫資料丟失和不一致的情況是可能發生的。這種方法得不償失。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-688047/,如需轉載,請註明出處,否則將追究法律責任。

相關文章