本站不再更新,歡迎光臨 java開(kāi)發(fā)技術(shù)網(wǎng)
          隨筆-230  評(píng)論-230  文章-8  trackbacks-0
          在大量業(yè)務(wù)數(shù)據(jù)處理的項(xiàng)目中,可以考慮使用分區(qū)表來(lái)提高應(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ù)在讀寫(xiě)操作和查詢中速度更快,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ū)映射到磁盤(pán)以平衡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ū)方法來(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.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。該表將來(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.

             建表成功,根據(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.

            這樣我們就分別建了以交易序號(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.1.2. Hash分區(qū)(散列分區(qū))

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

            建表成功,此時(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 有貓相伴的日子 閱讀(383) 評(píng)論(2)  編輯  收藏 所屬分類: pl/sql

          評(píng)論:
          # re: 分區(qū)表例子[未登錄](méi) 2008-08-28 17:59 | x
          本站不再更新,歡迎光臨 java開(kāi)發(fā)技術(shù)網(wǎng)
          主站蜘蛛池模板: 扶风县| 田林县| 鹤庆县| 双鸭山市| 如东县| 江北区| 门头沟区| 德昌县| 清河县| 鄂伦春自治旗| 昌都县| 巴彦县| 深泽县| 嘉荫县| 偃师市| 安达市| 同江市| 文化| 伽师县| 澎湖县| 盐源县| 尤溪县| 如东县| 洛南县| 长沙市| 武乡县| 横山县| 鹤山市| 景东| 遂川县| 双江| 嘉善县| 安仁县| 页游| 东海县| 沙洋县| 沐川县| 拉萨市| 米脂县| 湛江市| 获嘉县|