<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評(píng)論-209  文章-0  trackbacks-0

    表壓縮是如何工作的

    Orcle9i2版中,表壓縮特性通過(guò)刪除在數(shù)據(jù)庫(kù)表中發(fā)現(xiàn)的重復(fù)數(shù)據(jù)值來(lái)節(jié)省空間。壓縮是在數(shù)據(jù)庫(kù)的數(shù)據(jù)塊級(jí)別上進(jìn)行的。當(dāng)確定一個(gè)表要被壓縮后,數(shù)據(jù)庫(kù)便在每一個(gè)數(shù)據(jù)庫(kù)數(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ù)庫(kù)行本身內(nèi)。當(dāng)在一個(gè)數(shù)據(jù)庫(kù)行中出現(xiàn)被標(biāo)識(shí)為要壓縮的數(shù)據(jù)時(shí),該行在該符號(hào)表中存儲(chǔ)一個(gè)指向相關(guān)數(shù)據(jù)的指針,而不是數(shù)據(jù)本身。節(jié)約空間是通過(guò)刪除表中數(shù)據(jù)值的冗余拷貝而實(shí)現(xiàn)的。

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

    1.表級(jí)別:

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

    創(chuàng)建表時(shí)使用COMPRESS關(guān)鍵字,COMPRESS關(guān)鍵字指示Oracle數(shù)據(jù)庫(kù)盡可能以壓縮的格式存儲(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來(lái)定義,也可以稍后時(shí)間利用ALTER TABLESPACE來(lái)定義。

    與其他存儲(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ù)并沒(méi)有壓縮,它只是修改了數(shù)據(jù)字典的設(shè)置;只有在向一個(gè)表中加裁/插入數(shù)據(jù)時(shí),才會(huì)壓縮數(shù)據(jù).

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

    • 直接路徑的 sql*load
    • 帶有/*+ append*/ insert語(yǔ)句
    • 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來(lái)解壓一個(gè)已經(jīng)壓縮的表:

    SQL> alter table tmp_test move nocompress;

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

    使用用于壓縮表的類似方式來(lái)壓縮物化視圖。

    基于多個(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命令來(lái)改變一個(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.壓縮表的性能開(kāi)銷

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

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

    表名

     

    行數(shù)

     

    路徑

     

    是否是壓縮的

     

    消耗的時(shí)間

     

    test_nocom

     

    1000000

     

    直接

     

    非壓縮的

     

    00:00:21.12

     

    test_comp

     

    1000000

     

    直接

     

    壓縮的

     

    00:00:47.77

     

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

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

    posted on 2010-07-16 14:58 xzc 閱讀(5566) 評(píng)論(2)  編輯  收藏 所屬分類: Oracle

    評(píng)論:
    # re: oracle壓縮表表空間 2010-07-19 21:05 | xzc
    壓縮數(shù)據(jù)以節(jié)省空間和提高速度(某位帥多友情奉獻(xiàn)的資料,好東東!)2007-03-30 15:55使用表壓縮來(lái)節(jié)省空間并提高查詢性能。

      很多決策支持系統(tǒng)通常都涉及到存儲(chǔ)于幾個(gè)特大表中的大量數(shù)據(jù)。隨著這些系統(tǒng)的發(fā)展,對(duì)磁盤(pán)空間的需求也在快速增長(zhǎng)。在當(dāng)今的環(huán)境下,存儲(chǔ)著數(shù)百TB(太字節(jié))的數(shù)據(jù)倉(cāng)庫(kù)已經(jīng)變得越來(lái)越普遍。
      
      為了幫助處理磁盤(pán)容量問(wèn)題,在Oracle9i第2版中引入了表壓縮特性,它可以極大地減少數(shù)據(jù)庫(kù)表所需要的磁盤(pán)空間數(shù)量,并在某些情況下提高查詢性能。
      
      在本文中,我將向你說(shuō)明表壓縮是如何工作的,以及在構(gòu)建和管理數(shù)據(jù)庫(kù)時(shí)如何配置表空間。我還將基于一些示例測(cè)試結(jié)構(gòu)討論一些性能問(wèn)題,以幫助你了解使用表壓縮預(yù)計(jì)能獲得多大好處。
      
      表壓縮是如何工作的
      
      在Orcle9i第2版中,表壓縮特性通過(guò)刪除在數(shù)據(jù)庫(kù)表中發(fā)現(xiàn)的重復(fù)數(shù)據(jù)值來(lái)節(jié)省空間。壓縮是在數(shù)據(jù)庫(kù)的數(shù)據(jù)塊級(jí)別上進(jìn)行的。當(dāng)確定一個(gè)表要被壓縮后,數(shù)據(jù)庫(kù)便在每一個(gè)數(shù)據(jù)庫(kù)數(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ù)庫(kù)行本身內(nèi)。當(dāng)在一個(gè)數(shù)據(jù)庫(kù)行中出現(xiàn)被標(biāo)識(shí)為要壓縮的數(shù)據(jù)時(shí),該行在該符號(hào)表中存儲(chǔ)一個(gè)指向相關(guān)數(shù)據(jù)的指針,而不是數(shù)據(jù)本身。節(jié)約空間是通過(guò)刪除表中數(shù)據(jù)值的冗余拷貝而實(shí)現(xiàn)的。
      
      對(duì)于用戶或應(yīng)用程序開(kāi)發(fā)人員來(lái)說(shuō),表壓縮的效果是透明的。無(wú)論表是否被壓縮,開(kāi)發(fā)人員訪問(wèn)表的方式都是相同的,所以當(dāng)你決定壓縮一個(gè)表時(shí),不需要修改SQL查詢。表壓縮的設(shè)置通常由數(shù)據(jù)庫(kù)管理人員或設(shè)計(jì)人員進(jìn)行配置,幾乎不需要開(kāi)發(fā)人員或用戶參與。
      
      如何創(chuàng)建一個(gè)壓縮的表
      
      要?jiǎng)?chuàng)建一個(gè)壓縮的表,可在CREATE TABLE語(yǔ)句中使用COMPRESS關(guān)鍵字。COMPRESS關(guān)鍵字指示Oracle數(shù)據(jù)庫(kù)盡可能以壓縮的格式存儲(chǔ)該表中的行。下面是CREATE TABLE COMPRESS語(yǔ)句的一個(gè)實(shí)例:
      
      CREATE TABLE SALES_HISTORY_COMP (
      PART_ID    VARCHAR2(50) NOT NULL,
      STORE_ID   VARCHAR2(50) NOT NULL,
      SALE_DATE   DATE NOT NULL,
      QUANTITY   NUMBER(10,2) NOT NULL
      )
      COMPRESS
      ;
      
      或者,你可以用ALTER TABLE語(yǔ)句來(lái)修改已有表的壓縮屬性,如下所示:
      
      ALTER TABLE SALES_HISTORY_COMP COMPRESS;
      
      為了確定是否已經(jīng)利用COMPRESS對(duì)一個(gè)表進(jìn)行了定義,可查詢USER_TABLES數(shù)據(jù)字典視圖并查看COMPRESSION列,如下面的例子所示:
      
      SELECT TABLE_NAME, COMPRESSION FROM USER_TABLES;
      
      TABLE_NAME      COMPRESSION
      ------------------  -----------
      SALES_HISTORY    DISABLED
      
      SALES_HISTORY_COMP  ENABLED
      
      也可以在表空間級(jí)別上定義COMPRESS屬性,既可以在生成時(shí)利用CREATE TABLESPACE來(lái)定義,也可以稍后時(shí)間利用ALTER TABLESPACE來(lái)定義。與其他存儲(chǔ)參數(shù)類似,COMPRESS屬性也具有一些繼承特性。當(dāng)在一個(gè)表空間中創(chuàng)建一個(gè)表時(shí),它從該表空間繼承COMPRESS屬性。為了確定是否已經(jīng)利用COMPRESS對(duì)一個(gè)表空間進(jìn)行了定義,可查詢USER_TABLESPACES數(shù)據(jù)字典視圖并查看DEF_TAB_COMPRESSION列,如下面的例子所示:
      
      SELECT TABLESPACE_NAME,
      DEF_TAB_COMPRESSION
      FROM DBA_TABLESPACES;
      
      TABLESPACE_NAME   DEF_TAB_COMPRESSION
      ---------------  -------------------
      DATA_TS_01     DISABLED
      INDEX_TS_01     DISABLED
      
      正如你所預(yù)計(jì)的那樣,你可以在一個(gè)表空間直接壓縮或解壓縮一個(gè)表,而不用考慮表空間級(jí)別上的COMPRESS屬性。
      
      向一個(gè)壓縮的表中加載數(shù)據(jù)
      
      請(qǐng)注意,當(dāng)你像上面那樣指定COMPRESS時(shí),你并沒(méi)在實(shí)際壓縮任何數(shù)據(jù)。上面的這些命令只是修改了一個(gè)數(shù)據(jù)字典的設(shè)置。只有你向一個(gè)表中加載或插入數(shù)據(jù)時(shí)才會(huì)實(shí)際壓縮數(shù)據(jù)。
      
      而且,為了確保數(shù)據(jù)被實(shí)際壓縮,你需要利用一種正確的方法將數(shù)據(jù)加載或插入到表中。只有在利用以下4種方法之一批量加載或批量插入過(guò)程中才會(huì)進(jìn)行數(shù)據(jù)壓縮:
      
      直接路徑SQL*Loader
      帶有APPEND提示的串行INSERT
      并行INSERT
      CREATE TABLE ... AS SELECT
      
      如果在一個(gè)平面文件中有輸入數(shù)據(jù)是可用的,那么直接路徑SQL*Loader方法是將這些輸入數(shù)據(jù)加載至一個(gè)表格中最方便的手段。下面給出一個(gè)示例:
      
      $sqlldr sanjay/sanjay@proddb control=sales_history.ctl direct=true
      
      如果在一個(gè)登臺(tái)表中有輸入數(shù)據(jù),那么你可以使用帶有APPEND提示的串行INSERT方法或者并行INSERT方法。
      
      作為一個(gè)例子,請(qǐng)看一個(gè)名為SALES_HISTORY的未壓縮登臺(tái)表中的可用輸入數(shù)據(jù)。用串行INSERT方法時(shí),你可以使用以下的語(yǔ)句向已壓縮表中插入數(shù)據(jù):
      
      INSERT /*+ APPEND */
      
      INTO SALES_HISTORY_COMP
      SELECT * FROM SALES_HISTORY;
      
      或者,你也可以用并行INSERT方法將數(shù)據(jù)由一個(gè)登臺(tái)表轉(zhuǎn)移到一個(gè)已壓縮表中,如下所示:
      
      ALTER SESSION ENABLE PARALLEL DML;
      
      INSERT /*+PARALLEL(SALES_HISTORY_COMP,4)*/
      INTO SALES_HISTORY_COMP
      SELECT * FROM SALES_HISTORY;
      
      請(qǐng)注意,在使用并行INSERT方法時(shí),你需要首先利用ALTER SESSION ENABLE PARALLEL DML命令為會(huì)話期來(lái)啟動(dòng)并行DML。
      
      如果輸入數(shù)據(jù)位于一個(gè)平面文件中,那么你也可以使用一個(gè)外部表,然后將這些數(shù)據(jù)插入到一個(gè)壓縮表中,就像這些數(shù)據(jù)放在一個(gè)登臺(tái)表中可用一樣。(對(duì)外部表的討論超出了本文的范圍)。
      
      你還可以使用CREATE TABLE ... AS SELECT語(yǔ)句一次生成一個(gè)壓縮表,并將數(shù)據(jù)插入至其中。 這里有一個(gè)例子:
      
      CREATE TABLE SALES_HISTORY_COMP
      COMPRESS
      AS SELECT * FROM SALES_HISTORY;
      
      如果你沒(méi)有使用正確的加載或INSERT方法,那么即使使用COMPRESS對(duì)表格進(jìn)行了定義,該表中的數(shù)據(jù)也將仍然保持未壓縮狀態(tài)。 例如,如果你使用慣用路徑SQL*Loader或正則INSERT語(yǔ)句,那么數(shù)據(jù)仍然是未壓縮的。
      
      什么時(shí)候使用表壓縮
      
      Oracle數(shù)據(jù)庫(kù)選擇用來(lái)壓縮表數(shù)據(jù)或不壓縮表數(shù)據(jù)的方式已暗中牽涉到了最適合于表壓縮的應(yīng)用程序。如上所述,一個(gè)表中已被使用COMPRESS定義的數(shù)據(jù),只有在使用直接路徑模式被加載或利用添加(append)或并行模式被插入時(shí),才會(huì)得到壓縮。通過(guò)正則插入語(yǔ)句插入的數(shù)據(jù)將保持未壓縮狀態(tài)。
      
      在在線事務(wù)處理(OLTP)系統(tǒng)中,通常是使用正則插入模式來(lái)插入數(shù)據(jù)的。因此,使用表壓縮通常不會(huì)使這些表格獲得太大的好處。 表壓縮對(duì)于那些只加載一次但多次讀取的只讀表格具有最佳效果。例如,數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用程序中所用的表格特別適合于進(jìn)行表壓縮。
      
      此外,在一個(gè)已壓縮表中更新數(shù)據(jù)可能要求數(shù)據(jù)行為非壓縮的,這樣就達(dá)不到進(jìn)行壓縮的目的。因此,那些需要經(jīng)常進(jìn)行更新操作的表不適于進(jìn)行表壓縮。
      
      最后,讓我們來(lái)看一下行刪除對(duì)表壓縮應(yīng)用的影響。當(dāng)你刪除一個(gè)壓縮的表中的一行時(shí),數(shù)據(jù)庫(kù)將釋放該行在數(shù)據(jù)庫(kù)數(shù)據(jù)塊中所占據(jù)的空間。 這一自由空間可以由未來(lái)插入的數(shù)據(jù)重新使用。但是,由于以慣用模式插入的行不能被壓縮,所以它不太可能適合放在一個(gè)被壓縮的行所釋放的空間。大量的相繼的DELETE與INSERT語(yǔ)句可能會(huì)導(dǎo)致磁盤(pán)碎片,且所浪費(fèi)的空間甚至?xí)嘤谑褂脡嚎s所能節(jié)省的空間。
      
      壓縮一個(gè)已有的未壓縮表
      
      如果你有一個(gè)已有的未壓縮表,那么你可以利用ALTER... MOVE語(yǔ)句對(duì)其進(jìn)行壓縮。例如,可以利用以下方法對(duì)一個(gè)名為SALES_HISTORY_TEMP的未壓縮表進(jìn)行壓縮:
      
      ALTER TABLE SALES_HISTORY_TEMP
      MOVE COMPRESS;
      
      你也可以將ALTER TABLE ...MOVE語(yǔ)句用于解壓縮一個(gè)表,如下例所示:
      
      ALTER TABLE SALES_HISTORY_TEMP
      MOVE NOCOMPRESS;
      
      請(qǐng)注意,ALTER TABLE ...MOVE操作會(huì)獲得一個(gè)對(duì)該表操作的EXCLUSIVE鎖,它可以在該語(yǔ)句執(zhí)行過(guò)程中禁止對(duì)該表進(jìn)行任何DML操作。你可以利用Oracle9i數(shù)據(jù)庫(kù)的在線表重定義特性來(lái)避免這一可能出現(xiàn)的問(wèn)題。
      
      壓縮一個(gè)物化視圖
      
      你可以使用用于壓縮表的類似方式來(lái)壓縮物化視圖。下面的命令生成一個(gè)壓縮的物化視圖:
      
      CREATE MATERIALIZED VIEW MV_SALES_COMP
      COMPRESS
      AS SELECT P.PART_NAME, H.STORE_ID, H.SALE_DATE, H.QUANTITY
      FROM SALES_HISTORY H, PARTS P
      WHERE P.PART_ID = H.PART_ID;
      
      基于多個(gè)表的聯(lián)接生成的物化視圖通常很適于壓縮,因?yàn)樗鼈兺ǔ碛写罅康闹貜?fù)數(shù)據(jù)項(xiàng)。你可以使用ALTER MATERIALIZED VIEW命令來(lái)改變一個(gè)物化視圖的壓縮屬性。下面的命令顯示了如何壓縮一個(gè)已有的未壓縮的物化視圖。
      
      ALTER MATERIALIZED VIEW MV_SALES COMPRESS;
      
      當(dāng)你使用此命令時(shí),請(qǐng)注意通常是在下一次刷新該物化視圖時(shí)才會(huì)進(jìn)行實(shí)際的壓縮。
      
      壓縮一個(gè)已分區(qū)的表
      
      在對(duì)已分區(qū)的表應(yīng)用壓縮時(shí),可以有很多種選擇。你可以在表級(jí)別上應(yīng)用壓縮,也可以在分區(qū)級(jí)別上應(yīng)用壓縮。例如,代碼清單 1中的CREATE TABLE語(yǔ)句創(chuàng)建一個(gè)具有4個(gè)分區(qū)的表。 由于是在表級(jí)別指定了COMPRESS,所以對(duì)全部4個(gè)分區(qū)都進(jìn)行壓縮。
      
      由于可以在分區(qū)級(jí)別上指定壓縮屬性,所以你可以選擇壓縮某些分區(qū),而使另一些分區(qū)保持未壓縮狀態(tài)。代碼清單 2中的示例說(shuō)明了如何在分區(qū)級(jí)別上指定壓縮屬性。
      
      在代碼清單 2中,壓縮了兩個(gè)表分區(qū)(SALES_Q1_03和SALES_Q2_03) ,而另外兩個(gè)分區(qū)未被壓縮。要注意,在分區(qū)級(jí)別上指定的壓縮屬性會(huì)取代對(duì)該分區(qū)在表級(jí)別上特定的壓縮屬性。如果未為一個(gè)分區(qū)指定壓縮屬性,那么該分區(qū)將繼承在表級(jí)別上指定的壓縮屬性。在代碼清單 2中,由于未對(duì)分區(qū)SALES_Q3_03和SALES_Q4_03指定壓縮屬性,所以這兩個(gè)分區(qū)繼承表級(jí)別上指定的屬性值(在本例情況下為默認(rèn)的NOCOMPRESS)。
      
      在通過(guò)壓縮來(lái)使用已分區(qū)的表時(shí),它可以提供一個(gè)獨(dú)特的好處。對(duì)表進(jìn)行分區(qū)的一個(gè)非常有用的方法是將要對(duì)其進(jìn)行DML操作(插入、更新與刪除)的數(shù)據(jù)放入與只讀文件分開(kāi)的分區(qū)內(nèi)。例如,在代碼清單 2的表定義中,根據(jù)SALE_DATE對(duì)銷售數(shù)據(jù)進(jìn)行了分區(qū),這樣可將每一季度的銷售歷史數(shù)據(jù)存儲(chǔ)在一個(gè)單獨(dú)的分區(qū)內(nèi)。在此示例中,2003年第1、2季度的銷售數(shù)據(jù)不能被修改,所以將它們置于壓縮分區(qū)SALES_Q1_03 和SALES_Q2_03中。對(duì)于第3、4季度的銷售數(shù)據(jù)仍可以進(jìn)行修改,所以相應(yīng)的分區(qū)SALES_Q3_03和SALES_Q4_03保持未壓縮狀態(tài)。
      
      如果在2003年第3季度末,SALES_Q3_03分區(qū)中的數(shù)據(jù)變?yōu)橹蛔x的,那么你可以利用ALTER TABLE ...MOVE PARTITION命令對(duì)此分區(qū)進(jìn)行壓縮,如下面的語(yǔ)句所示:
      
      ALTER TABLE SALES_PART_COMP
      MOVE PARTITION SALES_Q3_03 COMPRESS;
      
      要找出一個(gè)表中的哪些分區(qū)被壓縮了,可以查詢數(shù)據(jù)字典視圖USER_TAB_PARTITIONS,如下例所示:
      
      SELECT TABLE_NAME, PARTITION_NAME,
      COMPRESSION
      
      FROM USER_TAB_PARTITIONS;
      
      TABLE_NAME   PARTITION_NAME COMPRESSION
      ---------------------------- -----------
      SALES_PART_COMP SALES_Q4_03  DISABLED
      SALES_PART_COMP SALES_Q1_03  ENABLED
      SALES_PART_COMP SALES_Q2_03  ENABLED
      SALES_PART_COMP SALES_Q3_03  ENABLED
      
      定量地評(píng)價(jià)壓縮帶來(lái)的好處
      
      使用表壓縮的最主要原因是要節(jié)省存儲(chǔ)空間。壓縮形式的表所占用的空間通常小于其非壓縮形式所占用的空間。為了說(shuō)明這一點(diǎn),可考慮以下測(cè)試,其中有兩個(gè)表--一個(gè)是未壓縮的(SALES_HISTORY),一個(gè)是壓縮的(SALES_HISTORY_COMP)。這兩個(gè)表都是利用直接路徑SQL*Loader由一個(gè)包含有200萬(wàn)行的單一平面文件加載的。在完成了對(duì)兩個(gè)表的數(shù)據(jù)加載后,壓縮的表所占用的空間差不多是未壓縮表的一半。代碼清單 3顯示了分析結(jié)果。
      
      一個(gè)壓縮的表可以存儲(chǔ)在更少的數(shù)據(jù)塊中,從而節(jié)省了儲(chǔ)存空間,而使用更少的數(shù)據(jù)塊也意味著性能的提高。 在一個(gè)I/O受到一定限制的環(huán)境中對(duì)一個(gè)壓縮的表進(jìn)行查詢通常可以更快速地完成,因?yàn)樗麄冃枰喿x的數(shù)據(jù)庫(kù)數(shù)據(jù)塊要少得多。為了說(shuō)明這一點(diǎn),我對(duì)一個(gè)壓縮的表和一個(gè)未壓縮的表進(jìn)行查詢,并執(zhí)行一個(gè)SQLTRACE/TKPROF分析。代碼清單 4顯示了該分析結(jié)果。
      
      SQLTRACE/TKPROF報(bào)告表明:我對(duì)該壓縮表執(zhí)行的物理和邏輯I/O操作相對(duì)于對(duì)非壓縮表進(jìn)行的相應(yīng)查詢要少得多,因而執(zhí)行得也更快得多。
      
      性能開(kāi)銷
      
      由于表壓縮是在批量加載時(shí)進(jìn)行的,所以數(shù)據(jù)加載操作會(huì)因涉及附加的內(nèi)務(wù)操作而需要額外的處理工作。為了衡量壓縮對(duì)性能的影響,我進(jìn)行了一個(gè)測(cè)試,在該測(cè)試中,我向兩個(gè)相同的表中(一個(gè)壓縮的表,另一個(gè)未壓縮的表)加載了(利用直接路徑SQL*Loader)100萬(wàn)行數(shù)據(jù)。表 1顯示了由SQL*Loader日志文件中取出的結(jié)果,它們給出了向這兩個(gè)壓縮的與非壓縮的表中加載數(shù)據(jù)花費(fèi)了多少時(shí)間。
       
      表1:比較未壓縮的表與壓縮的表的加載時(shí)間
      
      加載壓縮的表所需要的額外時(shí)間源自在數(shù)據(jù)加載過(guò)程中所執(zhí)行的壓縮操作。在實(shí)際情況下,實(shí)際時(shí)間差取決于表的設(shè)計(jì)與給定環(huán)境下的數(shù)據(jù)的布局。
      
      結(jié)論
      
      Oracle9i第2版中的表壓縮特性可以節(jié)省大量的磁盤(pán)空間,尤其是對(duì)于具有大型只讀表的數(shù)據(jù)庫(kù)來(lái)說(shuō)更是如此。如果你能記住加載和插入需要,并能確定那些適于進(jìn)行壓縮的表,那么你會(huì)發(fā)現(xiàn),表壓縮是節(jié)省磁盤(pán)空間的絕佳方式,在某些情況下還可以提高查詢性能。

    ref: 壓縮已分區(qū)的表:http://xsb.itpub.net/post/419/57064http://www.oracle.com/global/cn/oramag/oracle/04-mar/o24tech_data.html
    http://www.stcore.com/html/2005/1130/104979.html



    附:
    1, 壓縮一個(gè)已存在的表空間:
    alter tablespace users default compress;
    僅對(duì)之后特殊方式插入的數(shù)據(jù)壓縮!

    2, 壓縮已分區(qū)表
    對(duì)已分區(qū)的表(甚至帶子分區(qū))進(jìn)行壓縮,如果不能一步完成,那么:
    分兩步半完成:

    alter table test compress;

    select 'alter table test move subpartition '|| subpartition_name||';' from user_tab_subpartitions where table_name like 'TEST';

    除表可以壓縮外,分區(qū)表可以壓縮,索引可以壓縮,物化視圖也可以壓縮。語(yǔ)法類似。
    注:除索引外,壓縮屬性可以繼承表空間的壓縮屬性。表空間改成壓縮的:
    alter tablespace ts_test default compress;

    以下5種情況可以發(fā)揮壓縮特性:
      直接路徑SQL*Loader
      帶有APPEND提示的串行INSERT
      并行INSERT
      CREATE TABLE ... AS SELECT
      alter table move

    壓縮可以大幅度減少空間占用(可壓縮60%以上),從而減少I(mǎi)O量,提高性能。

      回復(fù)  更多評(píng)論
      
    # re: oracle壓縮表表空間 2010-08-06 16:12 | xzc
    --刪除分區(qū)
    declare
    -- 這里是本地變量
    i integer;
    lc_date varchar2(10);
    cursor c_area_code is
    select 'ALTER TABLE odsstat.WID_SETT_TICKET_DAY_' || region_id || ' DROP PARTITION P' || lc_date || ';' a1
    from area_code
    where region_id <= 2500;
    begin
    -- 這里是測(cè)試語(yǔ)句
    for i in 1 .. 31 loop
    lc_date := to_char(to_date('20100531', 'YYYYMMDD') + i, 'YYYYMMDD');
    for c1 in c_area_code loop
    dbms_output.put_line(c1.a1);
    end loop;
    end loop;
    end;
    --壓縮分區(qū)
    declare
    -- 這里是本地變量
    i integer;
    lc_date varchar2(10);
    cursor c_area_code is
    select 'ALTER TABLE odsstat.WID_SETT_TICKET_DAY_' || region_id || ' MOVE PARTITION P' || lc_date ||
    ' COMPRESS;' a1
    from area_code
    where region_id <= 2500;
    begin
    -- 這里是測(cè)試語(yǔ)句
    for i in 1 .. 31 loop
    lc_date := to_char(to_date('20100630', 'YYYYMMDD') + i, 'YYYYMMDD');
    for c1 in c_area_code loop
    dbms_output.put_line(c1.a1);
    end loop;
    end loop;
    end;
    --增加分區(qū)
    declare
    -- 這里是本地變量
    i integer;
    lc_date varchar2(10);
    cursor c_area_code is
    select 'ALTER TABLE odsstat.WID_SETT_TICKET_DAY_' || region_id || ' ADD PARTITION P' || lc_date || ' VALUES (' ||
    lc_date || ') TABLESPACE SETTDATA_01 NOLOGGING;' a1
    from area_code
    where region_id <= 2500;
    begin
    -- 這里是測(cè)試語(yǔ)句
    for i in 1 .. 31 loop
    lc_date := to_char(to_date('20100831', 'YYYYMMDD') + i, 'YYYYMMDD');
    for c1 in c_area_code loop
    dbms_output.put_line(c1.a1);
    end loop;
    end loop;
    end;
      回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲精品福利网泷泽萝拉| 国产乱子影视频上线免费观看| 国产偷窥女洗浴在线观看亚洲| 成人婷婷网色偷偷亚洲男人的天堂| 18禁成年无码免费网站无遮挡| 亚洲av永久无码精品天堂久久| 国产四虎免费精品视频| 亚洲精品伊人久久久久| 在线免费视频一区| 亚洲国产精品日韩av不卡在线| 国产精品无码免费视频二三区| 在线观看免费亚洲| 亚洲熟妇少妇任你躁在线观看无码 | 亚洲午夜福利717| 精品免费视在线观看| 久久亚洲精品人成综合网| 最近免费中文字幕高清大全| 亚洲色欲色欲www| 色吊丝最新永久免费观看网站| 男女作爱免费网站| 美女被免费网站91色| 久久亚洲sm情趣捆绑调教| 国产成人免费爽爽爽视频| 色屁屁在线观看视频免费| 亚洲精品乱码久久久久久自慰| 3d动漫精品啪啪一区二区免费| 亚洲国产成人精品无码一区二区| 日本牲交大片免费观看| 久久成人18免费网站| 亚洲精品视频免费看| 亚洲AV无码一区二区二三区软件| 日韩视频在线观看免费| 亚洲看片无码在线视频| 亚洲国产香蕉人人爽成AV片久久| 日韩免费高清播放器| 亚洲精品综合在线影院| 亚洲国产成人影院播放| 在线永久免费的视频草莓| 免费福利在线观看| 亚洲第一区视频在线观看| 免费大黄网站在线观|