本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
          隨筆-230  評(píng)論-230  文章-8  trackbacks-0
          在大量業(yè)務(wù)數(shù)據(jù)處理的項(xiàng)目中,可以考慮使用分區(qū)表來提高應(yīng)用系統(tǒng)的性能并方便數(shù)據(jù)管理,本文詳細(xì)介紹了分區(qū)表的使用。

            在大型的企業(yè)應(yīng)用或企業(yè)級(jí)的數(shù)據(jù)庫(kù)應(yīng)用中,要處理的數(shù)據(jù)量通常可以達(dá)到幾十到幾百GB,有的甚至可以到TB級(jí)。雖然存儲(chǔ)介質(zhì)和數(shù)據(jù)處理技術(shù)的發(fā)展也很快,但是仍然不能滿足用戶的需求,為了使用戶的大量的數(shù)據(jù)在讀寫操作和查詢中速度更快,Oracle提供了對(duì)表和索引進(jìn)行分區(qū)的技術(shù),以改善大型應(yīng)用系統(tǒng)的性能。

            使用分區(qū)的優(yōu)點(diǎn):

            ·增強(qiáng)可用性:如果表的某個(gè)分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;

            ·維護(hù)方便:如果表的某個(gè)分區(qū)出現(xiàn)故障,需要修復(fù)數(shù)據(jù),只修復(fù)該分區(qū)即可;

            ·均衡I/O:可以把不同的分區(qū)映射到磁盤以平衡I/O,改善整個(gè)系統(tǒng)性能;

            ·改善查詢性能:對(duì)分區(qū)對(duì)象的查詢可以僅搜索自己關(guān)心的分區(qū),提高檢索速度。

            Oracle數(shù)據(jù)庫(kù)提供對(duì)表或索引的分區(qū)方法有三種:

            ·范圍分區(qū)

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

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

            下面將以實(shí)例的方式分別對(duì)這三種分區(qū)方法來說明分區(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.1. 分區(qū)表的創(chuàng)建

            1.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。該表將來可能有千萬級(jí)的數(shù)據(jù)記錄數(shù)。要求在建該表的時(shí)候使用分區(qū)表。這時(shí)候我們可以使用序號(hào)分區(qū)三個(gè)區(qū),每個(gè)區(qū)中預(yù)計(jì)存儲(chǔ)三千萬的數(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.

             建表成功,根據(jù)交易的序號(hào),交易ID在三千萬以下的記錄將存儲(chǔ)在第一個(gè)表空間dinya_space01中,分區(qū)名為:par_01,在三千萬到六千萬之間的記錄存儲(chǔ)在第二個(gè)表空間:

            dinya_space02中,分區(qū)名為:par_02,而交易ID在六千萬以上的記錄存儲(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.

            這樣我們就分別建了以交易序號(hào)和交易日期來分區(qū)的分區(qū)表。每次插入數(shù)據(jù)的時(shí)候,系統(tǒng)將根據(jù)指定的字段的值來自動(dòng)將記錄存儲(chǔ)到制定的分區(qū)(表空間)中。

            當(dāng)然,我們還可以根據(jù)需求,使用兩個(gè)字段的范圍分布來分區(qū),如partition by range ( transaction_id ,transaction_date), 分區(qū)條件中的值也做相應(yīng)的改變,請(qǐng)讀者自行測(cè)試。

            1.1.2. Hash分區(qū)(散列分區(qū))

            散列分區(qū)為通過指定分區(qū)編號(hào)來均勻分布數(shù)據(jù)的一種分區(qū)類型,因?yàn)橥ㄟ^在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.

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

            1.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.

            該例中,先是根據(jù)交易日期進(jìn)行范圍分區(qū),然后根據(jù)交易的ID將記錄散列地存儲(chǔ)在三個(gè)表空間中
          posted on 2008-07-15 17:03 有貓相伴的日子 閱讀(384) 評(píng)論(2)  編輯  收藏 所屬分類: pl/sql

          評(píng)論:
          # re: 分區(qū)表例子[未登錄] 2008-08-28 17:59 | x
          本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
          主站蜘蛛池模板: 东源县| 南华县| 红安县| 新泰市| 五莲县| 枣强县| 子长县| 平顺县| 邵东县| 宜君县| 中宁县| 濮阳县| 肃宁县| 永修县| 二连浩特市| 温州市| 娄底市| 泸水县| 措美县| 本溪市| 读书| 农安县| 铁岭市| 柏乡县| 方山县| 大同市| 修文县| 松溪县| 乌拉特后旗| 威海市| 绥德县| 白银市| 雷山县| 务川| 黄平县| 精河县| 合江县| 承德市| 泰和县| 东丰县| 唐海县|