a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

Oracle數(shù)據(jù)庫中分區(qū)表的操作方法詳解

2024-08-29 13:50:34
字體:
來源:轉載
供稿:網(wǎng)友
摘要:在大量業(yè)務數(shù)據(jù)處理的項目中,可以考慮使用分區(qū)表來提高應用系統(tǒng)的性能并方便數(shù)據(jù)治理,本文具體介紹了分區(qū)表的使用。 在大型的企業(yè)應用或企業(yè)級的數(shù)據(jù)庫應用中,要處理的數(shù)據(jù)量通常可以達到幾十到幾百GB,有的甚至可以到TB級。雖然存儲介質和數(shù)據(jù)處理技術的發(fā)展也很快,但是仍然不能滿足用戶的需求,為了使用戶的大量的數(shù)據(jù)在讀寫操作和查詢中速度更快,Oracle提供了對表和索引進行分區(qū)的技術,以改善大型應用系統(tǒng)的性能。 使用分區(qū)的優(yōu)點: ·增強可用性:假如表的某個分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用; ·維護方便:假如表的某個分區(qū)出現(xiàn)故障,需要修復數(shù)據(jù),只修復該分區(qū)即可; ·均衡I/O:可以把不同的分區(qū)映射到磁盤以平衡I/O,改善整個系統(tǒng)性能; ·改善查詢性能:對分區(qū)對象的查詢可以僅搜索自己關心的分區(qū),提高檢索速度。 Oracle數(shù)據(jù)庫提供對表或索引的分區(qū)方法有三種: ·范圍分區(qū) ·Hash分區(qū)(散列分區(qū)) ·復合分區(qū) 下面將以實例的方式分別對這三種分區(qū)方法來說明分區(qū)表的使用。為了測試方便,我們先建三個表空間。 以下為引用的內容:
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ù)表中的某個值的范圍進行分區(qū),根據(jù)某個值的范圍,決定將該數(shù)據(jù)存儲在哪個分區(qū)上。如根據(jù)序號分區(qū),根據(jù)業(yè)務記錄的創(chuàng)建日期進行分區(qū)等。 需求描述:有一個物料交易表,表名:material_transactions。該表將來可能有千萬級的數(shù)據(jù)記錄數(shù)。要求在建該表的時候使用分區(qū)表。這時候我們可以使用序號分區(qū)三個區(qū),每個區(qū)中預計存儲三千萬的數(shù)據(jù),也可以使用日期分區(qū),如每五年的數(shù)據(jù)存儲在一個分區(qū)上。 根據(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_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在三千萬以下的記錄將存儲在第一個表空間dinya_space01中,分區(qū)名為:par_01,在三千萬到六千萬之間的記錄存儲在第二個表空間: dinya_space02中,分區(qū)名為:par_02,而交易ID在六千萬以上的記錄存儲在第三個表空間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.
這樣我們就分別建了以交易序號和交易日期來分區(qū)的分區(qū)表。每次插入數(shù)據(jù)的時候,系統(tǒng)將根據(jù)指定的字段的值來自動將記錄存儲到制定的分區(qū)(表空間)中。 當然,我們還可以根據(jù)需求,使用兩個字段的范圍分布來分區(qū),如partition by range ( transaction_id ,transaction_date), 分區(qū)條件中的值也做相應的改變,請讀者自行測試。
1.1.2. Hash分區(qū)(散列分區(qū)) 散列分區(qū)為通過指定分區(qū)編號來均勻分布數(shù)據(jù)的一種分區(qū)類型,因為通過在I/O設備上進行散列分區(qū),使得這些分區(qū)大小一致。如將物料交易表的數(shù)據(jù)根據(jù)交易ID散列地存放在指定的三個表空間中: 以下為引用的內容:
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ù)據(jù),系統(tǒng)將按transaction_id將記錄散列地插入三個分區(qū)中,這里也就是三個不同的表空間中。 1.1.3. 復合分區(qū) 有時候我們需要根據(jù)范圍分區(qū)后,每個分區(qū)內的數(shù)據(jù)再散列地分布在幾個表空間中,這樣我們就要使用復合分區(qū)。復合分區(qū)是先使用范圍分區(qū),然后在每個分區(qū)內再使用散列分區(qū)的一種分區(qū)方法,如將物料交易的記錄按時間分區(qū),然后每個分區(qū)中的數(shù)據(jù)分三個子分區(qū),將數(shù)據(jù)散列地存儲在三個指定的表空間中。 以下為引用的內容:
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ù)交易日期進行范圍分區(qū),然后根據(jù)交易的ID將記錄散列地存儲在三個表空間中。 1.2. 分區(qū)表操作 以上了解了三種分區(qū)表的建表方法,下面將使用實際的數(shù)據(jù)并針對按日期的范圍分區(qū)來測試分區(qū)表的數(shù)據(jù)記錄的操作。 1.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>
按上面的建表結果,2006年前的數(shù)據(jù)將存儲在第一個分區(qū)part_01上,而2006年到2010年的交易數(shù)據(jù)將存儲在第二個分區(qū)part_02上,2010年以后的記錄存儲在第三個分區(qū)part_03上。 1.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>
從查詢的結果可以看出,插入的數(shù)據(jù)已經(jīng)根據(jù)交易時間范圍存儲在不同的分區(qū)中。這里是指定了分區(qū)的查詢,當然也可以不指定分區(qū),直接執(zhí)行select * from dinya_test查詢全部記錄。
在也檢索的數(shù)據(jù)量很大的時候,指定分區(qū)會大大提高檢索速度。 1.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>
這里將第一個分區(qū)中的交易ID=1的記錄中的item_description字段更新為“DESK”,可以看到已經(jīng)成功更新了一條記錄。但是當更新的時候指定了分區(qū),而根據(jù)查詢的記錄不在該分區(qū)中時,將不會更新數(shù)據(jù),請看下面的例子: 以下為引用的內容:
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>
指定了在第一個分區(qū)中更新記錄,但是條件中限制交易ID為6,而查詢全表,交易ID為6的記錄在第三個分區(qū)中,這樣該條語句將不會更新記錄。 1.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>
上面例子刪除了第二個分區(qū)part_02中的交易記錄ID為4的一條記錄,和更新數(shù)據(jù)相同,假如指定了分區(qū),而條件中的數(shù)據(jù)又不在該分區(qū)中時,將不會刪除任何數(shù)據(jù)。 1.3. 分區(qū)表索引的使用: 分區(qū)表和一般表一樣可以建立索引,分區(qū)表可以創(chuàng)建局部索引和全局索引。當分區(qū)中出現(xiàn)許多事務并且要保證所有分區(qū)中的數(shù)據(jù)記錄的唯一性時采用全局索引。 1.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í)行計劃,從下面的執(zhí)行計劃可以看出,系統(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>
1.3.2. 全局索引分區(qū)的建立 全局索引建立時global 子句答應指定索引的范圍值,這個范圍值為索引字段的范圍值: 以下為引用的內容:
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>
本例中對表的item_id字段建立索引分區(qū),當然也可以不指定索引分區(qū)名直接對整個表建立索引,如: 以下為引用的內容:
SQL> create index dinya_idx_t on dinya_test(item_id); Index created. SQL>
同樣的,對全局索引根據(jù)執(zhí)行計劃可以看出索引已經(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>
1.4. 分區(qū)表的維護: 了解了分區(qū)表的建立、索引的建立、表和索引的使用后,在應用的還要經(jīng)常對分區(qū)進行維護和治理。日常維護和治理的內容包括:增加一個分區(qū),合并一個分區(qū)及刪除分區(qū)等等。下面以范圍分區(qū)為例說明增加、合并、刪除分區(qū)的一般操作: 1.4.1. 增加一個分區(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>
增加一個分區(qū)的時候,增加的分區(qū)的條件必須大于現(xiàn)有分區(qū)的最大值,否則系統(tǒng)將提示ORA-14074 partition bound must collate higher than that of the last partition 錯誤。 1.4.2. 合并一個分區(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ū)進行了合并,合并后的分區(qū)為part_02,假如在合并的時候把合并后的分區(qū)定為part_01的時候,系統(tǒng)將提示ORA-14275 cannot reuse lower-bound partition as resulting partition 錯誤。 1.4.3. 刪除分區(qū): 以下為引用的內容:
SQL> alter table dinya_test drop partition part_01; Table altered. SQL>
刪除分區(qū)表的一個分區(qū)后,查詢該表的數(shù)據(jù)時顯示,該分區(qū)中的數(shù)據(jù)已全部丟失,所以執(zhí)行刪除分區(qū)動作時要慎重,確保先備份數(shù)據(jù)后再執(zhí)行,或將分區(qū)合并。 1.5. 總結: 需要說明的是,本文在舉例說名分區(qū)表事務操作的時候,都指定了分區(qū),因為指定了分區(qū),系統(tǒng)在執(zhí)行的時候則只操作該分區(qū)的記錄,提高了數(shù)據(jù)處理的速度。不要指定分區(qū)直接操作數(shù)據(jù)也是可以的。在分區(qū)表上建索引及多索引的使用和非分區(qū)表一樣。此外,因為在維護分區(qū)的時候可能對分區(qū)的索引會產(chǎn)生一定的影響,可能需要在維護之后重建索引,相關內容請參考分區(qū)表索引部分的文檔


上一篇:Oracle Job任務異常原因分析及其解決

下一篇:Oracle SQL性能優(yōu)化系列介紹(上)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關注

主站蜘蛛池模板: 狠狠色丁香九九婷婷综合五月 | 日韩在线国产 | 一区二区久久 | 久久99国产精品 | 久久国产婷婷国产香蕉 | 国产精品视频不卡 | 一区二区三区四区在线 | 一二三四区视频 | 一区二区三区精品视频 | 麻豆国产一区二区三区四区 | avmans最新导航地址 | 91麻豆精品国产91久久久更新时间 | 国产一二三区在线观看 | 黄色资源在线观看 | 超碰在线播 | 在线播放国产一区二区三区 | 国产精品视频一区二区免费不卡 | 韩国精品视频在线观看 | 日韩精品区 | 亚洲日本精品一区二区三区 | 亚洲欧美日韩另类精品一区二区三区 | 欧美视频二区 | 久草视 | 中文字幕日本在线观看 | 91久久久久久久久久久 | 国产电影一区二区 | 蜜桃在线视频 | 久久综合一区二区 | 成年免费视频黄网站在线观看 | 免费国产视频 | 国产精品久久久久久久久久免费 | 操久久 | 在线播放91 | 日本三级做a全过程在线观看 | 国产看片网站 | 日韩美女在线视频 | 国产v片 | 亚洲www啪成人一区二区 | 精品视频一区二区在线观看 | 黄色影视免费观看 | 亚洲成人精品在线观看 |