共計 2883 個字符,預計需要花費 8 分鐘才能閱讀完成。
這篇文章給大家分享的是有關 oracle 如何實現(xiàn)壓縮表的內(nèi)容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。
表壓縮是如何工作的
在 Orcle9i 第 2 版中,表壓縮特性通過刪除在數(shù)據(jù)庫表中發(fā)現(xiàn)的重復數(shù)據(jù)值來節(jié)省空間。壓縮是在數(shù)據(jù)庫的數(shù)據(jù)塊級別上進行的。當確定一個表要被壓縮后,數(shù)據(jù)庫便在每一個數(shù)據(jù)庫數(shù)據(jù)塊中保留空間,以便儲存在該數(shù)據(jù)塊中的多個位置上出現(xiàn)的數(shù)據(jù)的單一拷貝。這一被保留的空間被稱作符號表(symbol table)。被標識為要進行壓縮的數(shù)據(jù)只存儲在該符號表中,而不是在數(shù)據(jù)庫行本身內(nèi)。當在一個數(shù)據(jù)庫行中出現(xiàn)被標識為要壓縮的數(shù)據(jù)時,該行在該符號表中存儲一個指向相關數(shù)據(jù)的指針,而不是數(shù)據(jù)本身。節(jié)約空間是通過刪除表中數(shù)據(jù)值的冗余拷貝而實現(xiàn)的。
對于用戶或應用程序開發(fā)人員來說,表壓縮的效果是透明的。無論表是否被壓縮,開發(fā)人員訪問表的方式都是相同的,所以當你決定壓縮一個表時,不需要修改 SQL 查詢。表壓縮的設置通常由數(shù)據(jù)庫管理人員或設計人員進行配置,幾乎不需要開發(fā)人員或用戶參與。
1. 表級別:
1.1 創(chuàng)建一個壓縮表:
創(chuàng)建表時使用 COMPRESS 關鍵字,COMPRESS 關鍵字指示 Oracle 數(shù)據(jù)庫盡可能以壓縮的格式存儲該表中的行。
SQL create table tmp_test
(id number,phone varchar2(20),create_time date)
compress;
1.2 修改現(xiàn)有表為壓縮表:
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 創(chuàng)建表壓縮空間:
可以在表空間級別上定義 COMPRESS 屬性,既可以在生成時利用 CREATE TABLESPACE 來定義,也可以稍后時間利用 ALTER TABLESPACE 來定義。
與其他存儲參數(shù)類似,COMPRESS 屬性也具有一些繼承特性。當在一個表空間中創(chuàng)建一個表時,它從該表空間繼承 COMPRESS 屬性。
可以在一個表空間直接壓縮或解壓縮一個表,而不用考慮表空間級別上的 COMPRESS 屬性。
2.2 使現(xiàn)有表空間轉(zhuǎn)換為壓縮表空間 SQL alter tablespace sms default compress;
SQL alter tablespace sms default nocompress;
2.3 確定是否已經(jīng)利用 COMPRESS 對一個表空間進行了定義,可查詢 USER_TABLESPACES 數(shù)據(jù)字典視圖并查看 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. 向一個壓縮的表中加載數(shù)據(jù)
注: 當像上面那樣指定 compress 時, 其它表中 (表空間) 的數(shù)據(jù)并沒有壓縮, 它只是修改了數(shù)據(jù)字典的設置; 只有在向一個表中加裁 / 插入數(shù)據(jù)時, 才會壓縮數(shù)據(jù).
只有在使用下面 4 種方法時, 表中的數(shù)據(jù)才會被壓縮存放:
直接路徑的 sql*load
帶有 /*+ append*/ 的 insert 語句
create table .. as select..
并行 insert
4. 壓縮一個已經(jīng)存在但并未壓縮的表
使用 alter table .. move compress 使一個已存在但未壓縮的表轉(zhuǎn)換為壓縮表.
SQL alter table tmp_test move compress;
同樣, 也可以使用 alter table.. move nocompress 來解壓一個已經(jīng)壓縮的表:
SQL alter table tmp_test move nocompress;
5. 壓縮一個物化視圖
使用用于壓縮表的類似方式來壓縮物化視圖。
基于多個表的聯(lián)接生成的物化視圖通常很適于壓縮,因為它們通常擁有大量的重復數(shù)據(jù)項。
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. 壓縮一個已分區(qū)的表
在對已分區(qū)的表應用壓縮時,可以有很多種選擇。你可以在表級別上應用壓縮,也可以在分區(qū)級別上應用壓縮。
你可以利用 ALTER TABLE …MOVE PARTITION 命令對此分區(qū)進行壓縮
SQL alter table tmp_test move partition create_200606 compress;
要找出一個表中的哪些分區(qū)被壓縮了,可以查詢數(shù)據(jù)字典視圖 USER_TAB_PARTITIONS
SQL SELECT TABLE_NAME, PARTITION_NAME,COMPRESSION FROM USER_TAB_PARTITIONS;
7. 壓縮表的性能開銷
一個壓縮的表可以存儲在更少的數(shù)據(jù)塊中,從而節(jié)省了儲存空間,而使用更少的數(shù)據(jù)塊也意味著性能的提高。 在一個 I / O 受到一定限制的環(huán)境中對一個壓縮的表進行查詢通常可以更快速地完成,因為他們需要閱讀的數(shù)據(jù)庫數(shù)據(jù)塊要少得多。
使用 sql*load 加載 100 萬數(shù)據(jù):
表名
行數(shù)
路徑
是否是壓縮的
消耗的時間
test_nocom
1000000
直接
非壓縮的
00:00:21.12
test_comp
1000000
直接
壓縮的
00:00:47.77
由此可以看出, 向壓縮表中加入數(shù)據(jù)的時間是正常表的一倍. 加載壓縮的表所需要的額外時間來自于在數(shù)據(jù)加載過程中所執(zhí)行的壓縮操作。
可以得出的結論是: 在很少改變的表上使用壓縮技術還是可以的. 表中數(shù)據(jù)經(jīng)常變動的情況下, 盡量不要使用表壓縮, 它影響插入操作.
感謝各位的閱讀!關于“oracle 如何實現(xiàn)壓縮表”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!