您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關oracle如何實現壓縮表的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
表壓縮是如何工作的
在Orcle9i第2版中,表壓縮特性通過刪除在數據庫表中發現的重復數據值來節省空間。壓縮是在數據庫的數據塊級別上進行的。當確定一個表要被壓縮后,數據庫便在每一個數據庫數據塊中保留空間,以便儲存在該數據塊中的多個位置上出現的數據的單一拷貝。這一被保留的空間被稱作符號表(symbol table)。被標識為要進行壓縮的數據只存儲在該符號表中,而不是在數據庫行本身內。當在一個數據庫行中出現被標識為要壓縮的數據時,該行在該符號表中存儲一個指向相關數據的指針,而不是數據本身。節約空間是通過刪除表中數據值的冗余拷貝而實現的。
對于用戶或應用程序開發人員來說,表壓縮的效果是透明的。無論表是否被壓縮,開發人員訪問表的方式都是相同的,所以當你決定壓縮一個表時,不需要修改SQL查詢。表壓縮的設置通常由數據庫管理人員或設計人員進行配置,幾乎不需要開發人員或用戶參與。
1.表級別:
1.1 創建一個壓縮表:
創建表時使用COMPRESS關鍵字,COMPRESS關鍵字指示Oracle數據庫盡可能以壓縮的格式存儲該表中的行。
SQL> create table tmp_test
(id number,phone varchar2(20),create_time date)
compress;
1.2 修改現有表為壓縮表:
SQL> alter table tmp_test compress;
取消表的壓縮:
SQL> alter table tmp_test nocompress;
1.3 確定表是否被壓縮:
確定一個表是否使用了壓縮,查詢user_tables,compression字段表明表是否被壓縮.
SQL> select table_name,compression from user_tables where table_name not like 'BIN%';
TABLE_NAME COMPRESS
------------------------------ --------
CLASSES ENABLED
ROOMS ENABLED
STUDENTS DISABLED
MAJOR_STATS DISABLED
2.表空間級別:
2.1 創建表壓縮空間:
可以在表空間級別上定義COMPRESS屬性,既可以在生成時利用CREATE TABLESPACE來定義,也可以稍后時間利用ALTER TABLESPACE來定義。
與其他存儲參數類似,COMPRESS屬性也具有一些繼承特性。當在一個表空間中創建一個表時,它從該表空間繼承COMPRESS屬性。
可以在一個表空間直接壓縮或解壓縮一個表,而不用考慮表空間級別上的COMPRESS屬性。
2.2 使現有表空間轉換為壓縮表空間 SQL> alter tablespace sms default compress;
SQL> alter tablespace sms default nocompress;
2.3 確定是否已經利用COMPRESS對一個表空間進行了定義,可查詢USER_TABLESPACES數據字典視圖并查看DEF_TAB_COMPRESSION列
SQL> select tablespace_name,def_tab_compression from user_tablespaces;
TABLESPACE DEF_TAB_
---------- --------
USERS DISABLED
TEST DISABLED
UNDOTBS01 DISABLED
STATPACK DISABLED
3.向一個壓縮的表中加載數據
注:當像上面那樣指定compress時,其它表中(表空間)的數據并沒有壓縮,它只是修改了數據字典的設置;只有在向一個表中加裁/插入數據時,才會壓縮數據.
只有在使用下面4種方法時,表中的數據才會被壓縮存放:
直接路徑的 sql*load
帶有/*+ append*/的 insert語句
create table .. as select..
并行insert
4.壓縮一個已經存在但并未壓縮的表
使用alter table .. move compress使一個已存在但未壓縮的表轉換為壓縮表.
SQL> alter table tmp_test move compress;
同樣,也可以使用alter table.. move nocompress來解壓一個已經壓縮的表:
SQL> alter table tmp_test move nocompress;
5.壓縮一個物化視圖
使用用于壓縮表的類似方式來壓縮物化視圖。
基于多個表的聯接生成的物化視圖通常很適于壓縮,因為它們通常擁有大量的重復數據項。
SQL> create materialized view mv_tmp_test
compress
as
select a.phone,b.create_time from tmp_test a,recv_stat b
where a.id=b.id;
可以使用ALTER MATERIALIZED VIEW命令來改變一個物化視圖的壓縮屬性。
當你使用此命令時,請注意通常是在下一次刷新該物化視圖時才會進行實際的壓縮。
SQL> alter materialized view mv_temp_test compress;
6.壓縮一個已分區的表
在對已分區的表應用壓縮時,可以有很多種選擇。你可以在表級別上應用壓縮,也可以在分區級別上應用壓縮。
你可以利用ALTER TABLE ...MOVE PARTITION命令對此分區進行壓縮
SQL> alter table tmp_test move partition create_200606 compress;
要找出一個表中的哪些分區被壓縮了,可以查詢數據字典視圖USER_TAB_PARTITIONS
SQL>SELECT TABLE_NAME, PARTITION_NAME,COMPRESSION FROM USER_TAB_PARTITIONS;
7.壓縮表的性能開銷
一個壓縮的表可以存儲在更少的數據塊中,從而節省了儲存空間,而使用更少的數據塊也意味著性能的提高。 在一個I/O受到一定限制的環境中對一個壓縮的表進行查詢通常可以更快速地完成,因為他們需要閱讀的數據庫數據塊要少得多。
使用sql*load加載100萬數據:
表名
| 行數
| 路徑
| 是否是壓縮的
| 消耗的時間
|
test_nocom
| 1000000
| 直接
| 非壓縮的
| 00:00:21.12
|
test_comp
| 1000000
| 直接
| 壓縮的
| 00:00:47.77
|
由此可以看出,向壓縮表中加入數據的時間是正常表的一倍.加載壓縮的表所需要的額外時間來自于在數據加載過程中所執行的壓縮操作。
可以得出的結論是:在很少改變的表上使用壓縮技術還是可以的.表中數據經常變動的情況下,盡量不要使用表壓縮,它影響插入操作.
感謝各位的閱讀!關于“oracle如何實現壓縮表”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。