時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
在大型的企業(yè)應(yīng)用或企業(yè)級的數(shù)據(jù)庫應(yīng)用中,要處理的數(shù)據(jù)量通??梢赃_(dá)到幾十到幾百GB,有的甚至可以到TB級。雖然存儲介質(zhì)和數(shù)據(jù)處理技術(shù)的發(fā)展也很快,但是仍然不能滿足用戶的需求,為了使用戶的大量的數(shù)據(jù)在讀寫操作和查詢中速度更快,Oracle提供了對表和索引進(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)性能;
·改善查詢性能:對分區(qū)對象的查詢可以僅搜索自己關(guān)心的分區(qū),提高檢索速度。
Oracle數(shù)據(jù)庫提供對表或索引的分區(qū)方法有三種:
·范圍分區(qū)
·Hash分區(qū)(散列分區(qū))
·復(fù)合分區(qū)
下面將以實(shí)例的方式分別對這三種分區(qū)方法來說明分區(qū)表的使用。為了測試方便,我們先建三個(gè)表空間。
以下為引用的內(nèi)容:
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ū)就是對數(shù)據(jù)表中的某個(gè)值的范圍進(jìn)行分區(qū),根據(jù)某個(gè)值的范圍,決定將該數(shù)據(jù)存儲在哪個(gè)分區(qū)上。如根據(jù)序號分區(qū),根據(jù)業(yè)務(wù)記錄的創(chuàng)建日期進(jìn)行分區(qū)等。
需求描述:有一個(gè)物料交易表,表名:material_transactions。該表將來可能有千萬級的數(shù)據(jù)記錄數(shù)。要求在建該表的時(shí)候使用分區(qū)表。這時(shí)候我們可以使用序號分區(qū)三個(gè)區(qū),每個(gè)區(qū)中預(yù)計(jì)存儲三千萬的數(shù)據(jù),也可以使用日期分區(qū),如每五年的數(shù)據(jù)存儲在一個(gè)分區(qū)上。
根據(jù)交易記錄的序號分區(qū)建表: 以下為引用的內(nèi)容:
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ù)交易的序號,交易ID在三千萬以下的記錄將存儲在第一個(gè)表空間dinya_space01中,分區(qū)名為:par_01,在三千萬到六千萬之間的記錄存儲在第二個(gè)表空間:
dinya_space02中,分區(qū)名為:par_02,而交易ID在六千萬以上的記錄存儲在第三個(gè)表空間dinya_space03中,分區(qū)名為par_03.
根據(jù)交易日期分區(qū)建表:
以下為引用的內(nèi)容:
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.
這樣我們就分別建了以交易序號和交易日期來分區(qū)的分區(qū)表。每次插入數(shù)據(jù)的時(shí)候,系統(tǒng)將根據(jù)指定的字段的值來自動將記錄存儲到制定的分區(qū)(表空間)中。
當(dāng)然,我們還可以根據(jù)需求,使用兩個(gè)字段的范圍分布來分區(qū),如partition
by range ( transaction_id ,transaction_date),
分區(qū)條件中的值也做相應(yīng)的改變,請讀者自行測試。
#p#副標(biāo)題#e#
1.1.2. Hash分區(qū)(散列分區(qū))
散列分區(qū)為通過指定分區(qū)編號來均勻分布數(shù)據(jù)的一種分區(qū)類型,因?yàn)橥ㄟ^在I/O設(shè)備上進(jìn)行散列分區(qū),使得這些分區(qū)大小一致。如將物料交易表的數(shù)據(jù)根據(jù)交易ID散列地存放在指定的三個(gè)表空間中:
以下為引用的內(nèi)容:
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ù)散列地存儲在三個(gè)指定的表空間中:
以下為引用的內(nèi)容:
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將記錄散列地存儲在三個(gè)表空間中。
1.2. 分區(qū)表操作
以上了解了三種分區(qū)表的建表方法,下面將使用實(shí)際的數(shù)據(jù)并針對按日期的范圍分區(qū)來測試分區(qū)表的數(shù)據(jù)記錄的操作。
1.2.1. 插入記錄:
以下為引用的內(nèi)容:
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ù)將存儲在第一個(gè)分區(qū)part_01上,而2006年到2010年的交易數(shù)據(jù)將存儲在第二個(gè)分區(qū)part_02上,2010年以后的記錄存儲在第三個(gè)分區(qū)part_03上。
1.2.2. 查詢分區(qū)表記錄: 以下為引用的內(nèi)容:
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
----------------------------------------------
關(guān)鍵詞標(biāo)簽:Oracle,數(shù)據(jù)庫,分區(qū)表
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法