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

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

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

    隨筆-71  評(píng)論-4  文章-0  trackbacks-0
    在大型的企業(yè)應(yīng)用或企業(yè)級(jí)的數(shù)據(jù)庫(kù)應(yīng)用中,要處理的數(shù)據(jù)量通常可以達(dá)到幾十到幾百GB,有的甚至可以到TB級(jí)。雖然存儲(chǔ)介質(zhì)和數(shù)據(jù)處理技術(shù)的發(fā)展也很快,但是仍然不能滿足用戶的需求,為了使用戶的大量的數(shù)據(jù)在讀寫(xiě)操作和查詢中速度更快,Oracle提供了對(duì)表和索引進(jìn)行分區(qū)的技術(shù),以改善大型應(yīng)用系統(tǒng)的性能。
    使用分區(qū)的優(yōu)點(diǎn):
        1、增強(qiáng)可用性:如果表的某個(gè)分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;
        2、維護(hù)方便:如果表的某個(gè)分區(qū)出現(xiàn)故障,需要修復(fù)數(shù)據(jù),只修復(fù)該分區(qū)即可;
        3、均衡I/O:可以把不同的分區(qū)映射到磁盤(pán)以平衡I/O,改善整個(gè)系統(tǒng)性能;
        4、改善查詢性能:對(duì)分區(qū)對(duì)象的查詢可以僅搜索自己關(guān)心的分區(qū),提高檢索速度。
        Oracle數(shù)據(jù)庫(kù)提供對(duì)表或索引的分區(qū)方法有三種:
            1、范圍分區(qū)
            2、Hash分區(qū)(散列分區(qū))
            3、復(fù)合分區(qū)
        下面將以實(shí)例的方式分別對(duì)這三種分區(qū)方法來(lái)說(shuō)明分區(qū)表的使用。為了測(cè)試方便,我們先建三個(gè)表空間。
    create tablespace dinya_space01
    datafile '/test/demo/oracle/demodata/dinya01.dnf' size 50M
    create tablespace dinya_space01
    datafile '/test/demo/oracle/demodata/dinya02.dnf' size 50M
    create tablespace dinya_space01
    datafile '/test/demo/oracle/demodata/dinya03.dnf' size 50M
     

    1 分區(qū)表的創(chuàng)建:

    1.1     范圍分區(qū)

        范圍分區(qū)就是對(duì)數(shù)據(jù)表中的某個(gè)值的范圍進(jìn)行分區(qū),根據(jù)某個(gè)值的范圍,決定將該數(shù)據(jù)存儲(chǔ)在哪個(gè)分區(qū)上。如根據(jù)序號(hào)分區(qū),根據(jù)業(yè)務(wù)記錄的創(chuàng)建日期進(jìn)行分區(qū)等。
        需求描述:有一個(gè)物料交易表,表名:material_transactions。該表將來(lái)可能有千萬(wàn)級(jí)的數(shù)據(jù)記錄數(shù)。要求在建該表的時(shí)候使用分區(qū)表。這時(shí)候我們可以使用序號(hào)分區(qū)三個(gè)區(qū),每個(gè)區(qū)中預(yù)計(jì)存儲(chǔ)三千萬(wàn)的數(shù)據(jù),也可以使用日期分區(qū),如每五年的數(shù)據(jù)存儲(chǔ)在一個(gè)分區(qū)上。
    根據(jù)交易記錄的序號(hào)分區(qū)建表:
    SQL> create table dinya_test
      2  (
      3      transaction_id number primary key,
      4      item_id number(8) not null,
      5      item_description varchar2(300),
      6      transaction_date date  not null
      7  )
      8  partition by range (transaction_id)
      9  (
     10      partition part_01 values less than(30000000) tablespace dinya_space01,
     11      partition part_02 values less than(60000000) tablespace dinya_space02,
     12      partition part_03 values less than(maxvalue) tablespace dinya_space03
     13  );

    Table created.

    SQL>


    建表成功,根據(jù)交易的序號(hào),交易ID在三千萬(wàn)以下的記錄將存儲(chǔ)在第一個(gè)表空間dinya_space01中,分區(qū)名為:par_01,在三千萬(wàn)到六千萬(wàn)之間的記錄存儲(chǔ)在第二個(gè)表空間:dinya_space02中,分區(qū)名為:par_02,而交易ID在六千萬(wàn)以上的記錄存儲(chǔ)在第三個(gè)表空間dinya_space03中,分區(qū)名為par_03.
    根據(jù)交易日期分區(qū)建表:
    SQL> create table dinya_test
      2  (
      3      transaction_id number primary key,
      4      item_id number(8) not null,
      5      item_description varchar2(300),
      6      transaction_date date not null  
      7  )
      8  partition by range (transaction_date)
      9  (
     10  partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace dinya_space01,
     11  partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd')) tablespace dinya_space02,
     12  partition part_03 values less than(maxvalue) tablespace dinya_space03
     13  );

    Table created.

    SQL>


    這樣我們就分別建了以交易序號(hào)和交易日期來(lái)分區(qū)的分區(qū)表。每次插入數(shù)據(jù)的時(shí)候,系統(tǒng)將根據(jù)指定的字段的值來(lái)自動(dòng)將記錄存儲(chǔ)到制定的分區(qū)(表空間)中。
        當(dāng)然,我們還可以根據(jù)需求,使用兩個(gè)字段的范圍分布來(lái)分區(qū),如partition by range ( transaction_id ,transaction_date),分區(qū)條件中的值也做相應(yīng)的改變,請(qǐng)讀者自行測(cè)試。
     

    1.2     Hash分區(qū)(散列分區(qū))

        散列分區(qū)為通過(guò)指定分區(qū)編號(hào)來(lái)均勻分布數(shù)據(jù)的一種分區(qū)類(lèi)型,因?yàn)橥ㄟ^(guò)在I/O設(shè)備上進(jìn)行散列分區(qū),使得這些分區(qū)大小一致。如將物料交易表的數(shù)據(jù)根據(jù)交易ID散列地存放在指定的三個(gè)表空間中:
    SQL> create table dinya_test
      2  (
      3      transaction_id number primary key,
      4      item_id number(8) not null,
      5      item_description varchar2(300),
      6      transaction_date date
      7  )
      8  partition by hash(transaction_id)
      9  (
     10      partition part_01 tablespace dinya_space01,
     11      partition part_02 tablespace dinya_space02,
     12      partition part_03 tablespace dinya_space03
     13  );

    Table created.

    SQL>


        建表成功,此時(shí)插入數(shù)據(jù),系統(tǒng)將按transaction_id將記錄散列地插入三個(gè)分區(qū)中,這里也就是三個(gè)不同的表空間中。
     

    1.3        復(fù)合分區(qū)

        有時(shí)候我們需要根據(jù)范圍分區(qū)后,每個(gè)分區(qū)內(nèi)的數(shù)據(jù)再散列地分布在幾個(gè)表空間中,這樣我們就要使用復(fù)合分區(qū)。復(fù)合分區(qū)是先使用范圍分區(qū),然后在每個(gè)分區(qū)內(nèi)再使用散列分區(qū)的一種分區(qū)方法,如將物料交易的記錄按時(shí)間分區(qū),然后每個(gè)分區(qū)中的數(shù)據(jù)分三個(gè)子分區(qū),將數(shù)據(jù)散列地存儲(chǔ)在三個(gè)指定的表空間中:
    SQL> create table dinya_test
      2  (
      3      transaction_id number primary key,
      4      item_id number(8) not null,
      5      item_description varchar2(300),
      6      transaction_date date
      7  )
      8  partition by range(transaction_date)subpartition by hash(transaction_id)
      9      subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
     10  (
     11      partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')),
     12      partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd')),
     13      partition part_03 values less than(maxvalue)
     14  );

    Table created.

    SQL>


        該例中,先是根據(jù)交易日期進(jìn)行范圍分區(qū),然后根據(jù)交易的ID將記錄散列地存儲(chǔ)在三個(gè)表空間中。
     

    2 分區(qū)表操作

    以上了解了三種分區(qū)表的建表方法,下面將使用實(shí)際的數(shù)據(jù)并針對(duì)按日期的范圍分區(qū)來(lái)測(cè)試分區(qū)表的數(shù)據(jù)記錄的操作。

    2.1     插入記錄:

    SQL> insert into dinya_test values(1,12,'BOOKS',sysdate);
    1 row created.
    SQL> insert into dinya_test values(2,12, 'BOOKS',sysdate+30);
    1 row created.
    SQL> insert into dinya_test values(3,12, 'BOOKS',to_date('2006-05-30','yyyy-mm-dd'));
    1 row created.
    SQL> insert into dinya_test values(4,12, 'BOOKS',to_date('2007-06-23','yyyy-mm-dd'));
    1 row created.
    SQL> insert into dinya_test values(5,12, 'BOOKS',to_date('2011-02-26','yyyy-mm-dd'));
    1 row created.
    SQL> insert into dinya_test values(6,12, 'BOOKS',to_date('2011-04-30','yyyy-mm-dd'));
    1 row created.
    SQL> commit;
    Commit complete.
    SQL>


        按上面的建表結(jié)果,2006年前的數(shù)據(jù)將存儲(chǔ)在第一個(gè)分區(qū)part_01上,而2006年到2010年的交易數(shù)據(jù)將存儲(chǔ)在第二個(gè)分區(qū)part_02上,2010年以后的記錄存儲(chǔ)在第三個(gè)分區(qū)part_03上。

    2.2     查詢分區(qū)表記錄:

    SQL> select * from dinya_test partition(part_01);

    TRANSACTION_ID    ITEM_ID       ITEM_DESCRIPTION            TRANSACTION_DATE
    --------------------------------------------------------------------------------
                 1     12            BOOKS                      2005-1-14 14:19:
                 2     12            BOOKS                      2005-2-13 14:19:
    SQL>

    SQL> select * from dinya_test partition(part_02);

    TRANSACTION_ID     ITEM_ID      ITEM_DESCRIPTION            TRANSACTION_DATE
    --------------------------------------------------------------------------------
                 3      12            BOOKS                       2006-5-30
                 4      12            BOOKS                       2007-6-23
    SQL>

    SQL> select * from dinya_test partition(part_03);

    TRANSACTION_ID     ITEM_ID         ITEM_DESCRIPTION      TRANSACTION_DATE
    --------------------------------------------------------------------------------
                 5      12               BOOKS                 2011-2-26
                 6      12               BOOKS                 2011-4-30
    SQL>


        從查詢的結(jié)果可以看出,插入的數(shù)據(jù)已經(jīng)根據(jù)交易時(shí)間范圍存儲(chǔ)在不同的分區(qū)中。這里是指定了分區(qū)的查詢,當(dāng)然也可以不指定分區(qū),直接執(zhí)行select * from dinya_test查詢?nèi)坑涗洝T谝矙z索的數(shù)據(jù)量很大的時(shí)候,指定分區(qū)會(huì)大大提高檢索速度。
     

    2.3     更新分區(qū)表的記錄:

    SQL> update dinya_test partition(part_01) t set t.item_description='DESK' where t.transaction_id=1;

    1 row updated.

    SQL> commit;

    Commit complete.

    SQL>
     
        這里將第一個(gè)分區(qū)中的交易ID=1的記錄中的item_description字段更新為"DESK",可以看到已經(jīng)成功更新了一條記錄。但是當(dāng)更新的時(shí)候指定了分區(qū),而根據(jù)查詢的記錄不在該分區(qū)中時(shí),將不會(huì)更新數(shù)據(jù),請(qǐng)看下面的例子:
     
    SQL> update dinya_test partition(part_01) t set t.item_description='DESK' where t.transaction_id=6;

    0 rows updated.

    SQL> commit;

    Commit complete.

    SQL>


    指定了在第一個(gè)分區(qū)中更新記錄,但是條件中限制交易ID為6,而查詢?nèi)恚灰譏D為6的記錄在第三個(gè)分區(qū)中,這樣該條語(yǔ)句將不會(huì)更新記錄。
     

    2.4     刪除分區(qū)表記錄:

    SQL> delete from dinya_test partition(part_02) t where t.transaction_id=4;
     
    1 row deleted.
     
    SQL> commit;
     
    Commit complete.
     
    SQL>
     
    上面例子刪除了第二個(gè)分區(qū)part_02中的交易記錄ID為4的一條記錄,和更新數(shù)據(jù)相同,如果指定了分區(qū),而條件中的數(shù)據(jù)又不在該分區(qū)中時(shí),將不會(huì)刪除任何數(shù)據(jù)。
     

    分區(qū)表索引的使用:

    分區(qū)表和一般表一樣可以建立索引,分區(qū)表可以創(chuàng)建局部索引和全局索引。當(dāng)分區(qū)中出現(xiàn)許多事務(wù)并且要保證所有分區(qū)中的數(shù)據(jù)記錄的唯一性時(shí)采用全局索引。

    3.1     局部索引分區(qū)的建立:

    SQL> create index dinya_idx_t on dinya_test(item_id)
      2  local
      3  (
      4     partition idx_1 tablespace dinya_space01,
      5     partition idx_2 tablespace dinya_space02,
      6     partition idx_3 tablespace dinya_space03
      7  );

    Index created.

    SQL>


    看查詢的執(zhí)行計(jì)劃,從下面的執(zhí)行計(jì)劃可以看出,系統(tǒng)已經(jīng)使用了索引:
    SQL> select * from dinya_test partition(part_01) t where t.item_id=12;
     
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=187)
       1    0   TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'DINYA_TEST' (Cost=
              2 Card=1 Bytes=187)
       2    1     INDEX (RANGE SCAN) OF 'DINYA_IDX_T' (NON-UNIQUE) (Cost=1
               Card=1)
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              4  consistent gets
              0  physical reads
              0  redo size
            334  bytes sent via SQL*Net to client
            309  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              2  rows processed
     
    SQL>
     

    3.2     全局索引分區(qū)的建立。

    全局索引建立時(shí)global 子句允許指定索引的范圍值,這個(gè)范圍值為索引字段的范圍值:
    SQL> create index dinya_idx_t on dinya_test(item_id)
      2  global partition by range(item_id)
      3  (
      4     partition idx_1 values less than (1000) tablespace dinya_space01,
      5     partition idx_2 values less than (10000) tablespace dinya_space02,
      6     partition idx_3 values less than (maxvalue) tablespace dinya_space03
      7  );

    Index created.

    SQL>


        本例中對(duì)表的item_id字段建立索引分區(qū),當(dāng)然也可以不指定索引分區(qū)名直接對(duì)整個(gè)表建立索引,如:
    SQL> create index dinya_idx_t on dinya_test(item_id);

    Index created.

    SQL>


        同樣的,對(duì)全局索引根據(jù)執(zhí)行計(jì)劃可以看出索引已經(jīng)可以使用:
    SQL> select * from dinya_test t where t.item_id=12;
     
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=3 Bytes=561)
       1    0   TABLE ACCESS (BY GLOBAL INDEX ROWID) OF 'DINYA_TEST' (Cost
              =2 Card=3 Bytes=561)
     
       2    1     INDEX (RANGE SCAN) OF 'DINYA_IDX_T' (NON-UNIQUE) (Cost=1
               Card=3)
    Statistics
    ----------------------------------------------------------
              5  recursive calls
              0  db block gets
             10  consistent gets
              0  physical reads
              0  redo size
            420  bytes sent via SQL*Net to client
            309  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              3  sorts (memory)
              0  sorts (disk)
              5  rows processed
     
    SQL>
       

    4 分區(qū)表的維護(hù):

        了解了分區(qū)表的建立、索引的建立、表和索引的使用后,在應(yīng)用的還要經(jīng)常對(duì)分區(qū)進(jìn)行維護(hù)和管理。日常維護(hù)和管理的內(nèi)容包括:增加一個(gè)分區(qū),合并一個(gè)分區(qū)及刪除分區(qū)等等。下面以范圍分區(qū)為例說(shuō)明增加、合并、刪除分區(qū)的一般操作:

    4.1     增加一個(gè)分區(qū):

    SQL> alter table dinya_test
      2  add partition part_04 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace dinya_spa
    ce03;

    Table altered.

    SQL>
     
        增加一個(gè)分區(qū)的時(shí)候,增加的分區(qū)的條件必須大于現(xiàn)有分區(qū)的最大值,否則系統(tǒng)將提示ORA-14074 partition bound must collate higher than that of the last partition 錯(cuò)誤。
       

    4.2     合并一個(gè)分區(qū):

    SQL> alter table dinya_test merge partitions part_01,part_02 into partition part_02;

    Table altered.

    SQL>


        在本例中將原有的表的part_01分區(qū)和part_02分區(qū)進(jìn)行了合并,合并后的分區(qū)為part_02,如果在合并的時(shí)候把合并后的分區(qū)定為part_01的時(shí)候,系統(tǒng)將提示ORA-14275 cannot reuse lower-bound partition as resulting partition 錯(cuò)誤。
     

    4.3     刪除分區(qū):

    SQL> alter table dinya_test drop partition part_01;

    Table altered.

    SQL>
     
        刪除分區(qū)表的一個(gè)分區(qū)后,查詢?cè)摫淼臄?shù)據(jù)時(shí)顯示,該分區(qū)中的數(shù)據(jù)已全部丟失,所以執(zhí)行刪除分區(qū)動(dòng)作時(shí)要慎重,確保先備份數(shù)據(jù)后再執(zhí)行,或?qū)⒎謪^(qū)合并。
     

    5  總結(jié):

        需要說(shuō)明的是,本文在舉例說(shuō)名分區(qū)表事務(wù)操作的時(shí)候,都指定了分區(qū),因?yàn)橹付朔謪^(qū),系統(tǒng)在執(zhí)行的時(shí)候則只操作該分區(qū)的記錄,提高了數(shù)據(jù)處理的速度。不要指定分區(qū)直接操作數(shù)據(jù)也是可以的。在分區(qū)表上建索引及多索引的使用和非分區(qū)表一樣。此外,因?yàn)樵诰S護(hù)分區(qū)的時(shí)候可能對(duì)分區(qū)的索引會(huì)產(chǎn)生一定的影響,可能需要在維護(hù)之后重建索引,相關(guān)內(nèi)容請(qǐng)參考分區(qū)表索引部分的文檔。
     
    posted on 2006-02-12 14:20 zjw_albert 閱讀(149) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲中文无韩国r级电影| 羞羞视频网站免费入口| 亚洲欧洲久久av| 免费电影在线观看网站| 暖暖日本免费中文字幕| 免费一级全黄少妇性色生活片| 亚洲a级在线观看| 67pao强力打造67194在线午夜亚洲| 亚洲区日韩区无码区| 国产男女猛烈无遮挡免费视频 | 亚洲JIZZJIZZ中国少妇中文| 免费无码AV电影在线观看| 日韩人妻无码精品久久免费一| sss日本免费完整版在线观看| 亚洲色偷偷色噜噜狠狠99| 亚洲精品456在线播放| 亚洲理论电影在线观看| 亚洲国产精品自在拍在线播放| 在线免费一区二区| 成年网站免费视频A在线双飞| 91青青青国产在观免费影视| 黄色网址在线免费| 免费成人在线视频观看| 中文字幕av免费专区| 一级做a爱过程免费视频高清| 老司机午夜性生免费福利| 亚洲人成欧美中文字幕| 亚洲中文字幕久久精品蜜桃| 亚洲另类图片另类电影| 亚洲av无码电影网| 国产精品亚洲精品青青青| 在线观看日本亚洲一区| 亚洲色www永久网站| 亚洲一区二区三区高清在线观看 | 最好看的中文字幕2019免费| 久久午夜伦鲁片免费无码| 久久成人免费电影| 99久9在线|免费| 91成年人免费视频| 天天干在线免费视频| 宅男666在线永久免费观看|