溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

oracle如何實(shí)現(xiàn)壓縮表

發(fā)布時(shí)間:2021-11-11 17:24:11 來源:億速云 閱讀:1586 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章給大家分享的是有關(guān)oracle如何實(shí)現(xiàn)壓縮表的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

表壓縮是如何工作的

Orcle9i2版中,表壓縮特性通過刪除在數(shù)據(jù)庫表中發(fā)現(xiàn)的重復(fù)數(shù)據(jù)值來節(jié)省空間。壓縮是在數(shù)據(jù)庫的數(shù)據(jù)塊級(jí)別上進(jìn)行的。當(dāng)確定一個(gè)表要被壓縮后,數(shù)據(jù)庫便在每一個(gè)數(shù)據(jù)庫數(shù)據(jù)塊中保留空間,以便儲(chǔ)存在該數(shù)據(jù)塊中的多個(gè)位置上出現(xiàn)的數(shù)據(jù)的單一拷貝。這一被保留的空間被稱作符號(hào)表(symbol table)。被標(biāo)識(shí)為要進(jìn)行壓縮的數(shù)據(jù)只存儲(chǔ)在該符號(hào)表中,而不是在數(shù)據(jù)庫行本身內(nèi)。當(dāng)在一個(gè)數(shù)據(jù)庫行中出現(xiàn)被標(biāo)識(shí)為要壓縮的數(shù)據(jù)時(shí),該行在該符號(hào)表中存儲(chǔ)一個(gè)指向相關(guān)數(shù)據(jù)的指針,而不是數(shù)據(jù)本身。節(jié)約空間是通過刪除表中數(shù)據(jù)值的冗余拷貝而實(shí)現(xiàn)的。

對(duì)于用戶或應(yīng)用程序開發(fā)人員來說,表壓縮的效果是透明的。無論表是否被壓縮,開發(fā)人員訪問表的方式都是相同的,所以當(dāng)你決定壓縮一個(gè)表時(shí),不需要修改SQL查詢。表壓縮的設(shè)置通常由數(shù)據(jù)庫管理人員或設(shè)計(jì)人員進(jìn)行配置,幾乎不需要開發(fā)人員或用戶參與。

1.表級(jí)別:

1.1 創(chuàng)建一個(gè)壓縮表:

創(chuàng)建表時(shí)使用COMPRESS關(guān)鍵字,COMPRESS關(guān)鍵字指示Oracle數(shù)據(jù)庫盡可能以壓縮的格式存儲(chǔ)該表中的行。

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 確定表是否被壓縮:

確定一個(gè)表是否使用了壓縮,查詢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.表空間級(jí)別:

2.1 創(chuàng)建表壓縮空間:

可以在表空間級(jí)別上定義COMPRESS屬性,既可以在生成時(shí)利用CREATE TABLESPACE來定義,也可以稍后時(shí)間利用ALTER TABLESPACE來定義。

與其他存儲(chǔ)參數(shù)類似,COMPRESS屬性也具有一些繼承特性。當(dāng)在一個(gè)表空間中創(chuàng)建一個(gè)表時(shí),它從該表空間繼承COMPRESS屬性。

可以在一個(gè)表空間直接壓縮或解壓縮一個(gè)表,而不用考慮表空間級(jí)別上的COMPRESS屬性。

2.2 使現(xiàn)有表空間轉(zhuǎn)換為壓縮表空間 SQL> alter tablespace sms default compress;
SQL> alter tablespace sms default nocompress;

2.3 確定是否已經(jīng)利用COMPRESS對(duì)一個(gè)表空間進(jìn)行了定義,可查詢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.向一個(gè)壓縮的表中加載數(shù)據(jù)

:當(dāng)像上面那樣指定compress時(shí),其它表中(表空間)的數(shù)據(jù)并沒有壓縮,它只是修改了數(shù)據(jù)字典的設(shè)置;只有在向一個(gè)表中加裁/插入數(shù)據(jù)時(shí),才會(huì)壓縮數(shù)據(jù).

只有在使用下面4種方法時(shí),表中的數(shù)據(jù)才會(huì)被壓縮存放:

  • 直接路徑的 sql*load

  • 帶有/*+ append*/ insert語句

  • create table .. as select..

  • 并行insert

4.壓縮一個(gè)已經(jīng)存在但并未壓縮的表

使用alter table .. move compress使一個(gè)已存在但未壓縮的表轉(zhuǎn)換為壓縮表.

SQL> alter table tmp_test move compress;

同樣,也可以使用alter table.. move nocompress來解壓一個(gè)已經(jīng)壓縮的表:

SQL> alter table tmp_test move nocompress;

5.壓縮一個(gè)物化視圖

使用用于壓縮表的類似方式來壓縮物化視圖。

基于多個(gè)表的聯(lián)接生成的物化視圖通常很適于壓縮,因?yàn)樗鼈兺ǔ碛写罅康闹貜?fù)數(shù)據(jù)項(xiàng)。

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命令來改變一個(gè)物化視圖的壓縮屬性。

當(dāng)你使用此命令時(shí),請(qǐng)注意通常是在下一次刷新該物化視圖時(shí)才會(huì)進(jìn)行實(shí)際的壓縮。

SQL> alter materialized view mv_temp_test compress;

6.壓縮一個(gè)已分區(qū)的表

在對(duì)已分區(qū)的表應(yīng)用壓縮時(shí),可以有很多種選擇。你可以在表級(jí)別上應(yīng)用壓縮,也可以在分區(qū)級(jí)別上應(yīng)用壓縮。

你可以利用ALTER TABLE ...MOVE PARTITION命令對(duì)此分區(qū)進(jìn)行壓縮

SQL> alter table tmp_test move partition create_200606 compress;

要找出一個(gè)表中的哪些分區(qū)被壓縮了,可以查詢數(shù)據(jù)字典視圖USER_TAB_PARTITIONS

SQL>SELECT TABLE_NAME, PARTITION_NAME,COMPRESSION FROM USER_TAB_PARTITIONS;

7.壓縮表的性能開銷

一個(gè)壓縮的表可以存儲(chǔ)在更少的數(shù)據(jù)塊中,從而節(jié)省了儲(chǔ)存空間,而使用更少的數(shù)據(jù)塊也意味著性能的提高。 在一個(gè)I/O受到一定限制的環(huán)境中對(duì)一個(gè)壓縮的表進(jìn)行查詢通常可以更快速地完成,因?yàn)樗麄冃枰喿x的數(shù)據(jù)庫數(shù)據(jù)塊要少得多。

使用sql*load加載100萬數(shù)據(jù):

表名

 

行數(shù)

 

路徑

 

是否是壓縮的

 

消耗的時(shí)間

 

test_nocom

 

1000000

 

直接

 

非壓縮的

 

00:00:21.12

 

test_comp

 

1000000

 

直接

 

壓縮的

 

00:00:47.77

 

由此可以看出,向壓縮表中加入數(shù)據(jù)的時(shí)間是正常表的一倍.加載壓縮的表所需要的額外時(shí)間來自于在數(shù)據(jù)加載過程中所執(zhí)行的壓縮操作。

可以得出的結(jié)論是:在很少改變的表上使用壓縮技術(shù)還是可以的.表中數(shù)據(jù)經(jīng)常變動(dòng)的情況下,盡量不要使用表壓縮,它影響插入操作.

感謝各位的閱讀!關(guān)于“oracle如何實(shí)現(xiàn)壓縮表”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)
推薦閱讀:
  1. 壓縮表
  2. oracle 11G表壓縮

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI