亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle數據庫中分區表的操作方法詳解

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


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

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

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

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂av女优| 成人黄色中文字幕| 在线观看日韩欧美| 性夜试看影院91社区| 中文日韩在线视频| 国产欧美在线视频| 欧美最猛性xxxxx亚洲精品| 日韩电影免费在线观看| 欧美日韩免费网站| 亚洲美女自拍视频| 亚洲第一页自拍| 国产成人综合久久| 国产suv精品一区二区三区88区| 日韩av影视综合网| 亚洲精品国产精品国自产观看浪潮| 国产欧美日韩高清| 97av在线影院| 亚洲精品99久久久久中文字幕| 亚洲大胆人体av| 91欧美精品成人综合在线观看| 日韩精品中文在线观看| 国产精品一区二区av影院萌芽| 欧美日韩亚洲天堂| 色婷婷亚洲mv天堂mv在影片| 综合网中文字幕| 国产精品劲爆视频| 久久国产精品久久精品| 久久免费视频观看| 亚洲跨种族黑人xxx| 欧美影院成年免费版| 欧美精品日韩www.p站| 欧美激情久久久久久| 国产精品永久在线| 欧美性猛交xxxx黑人| 国产男人精品视频| 97久久久久久| 亚洲欧美激情在线视频| 亚洲午夜性刺激影院| 日韩av在线免费观看一区| 欧美乱妇40p| 欧美性猛交xxxx免费看漫画| 欧美精品制服第一页| 91av视频在线播放| 久久久女人电视剧免费播放下载| 亚洲精品成人av| 欧美高清电影在线看| 91精品视频大全| 91在线免费看网站| 成人免费网站在线看| 亚洲天堂一区二区三区| 中文字幕一区二区三区电影| 欧美成在线视频| 国产精品久久视频| 日韩精品视频三区| 亚洲一区精品电影| 综合网中文字幕| 激情成人中文字幕| 国产精品一区二区三区毛片淫片| 国产精品扒开腿做爽爽爽视频| 精品视频—区二区三区免费| 91久久国产综合久久91精品网站| 啊v视频在线一区二区三区| 亚洲欧美综合另类中字| 久久九九全国免费精品观看| 亚洲综合一区二区不卡| 亚洲激情成人网| 2021国产精品视频| 午夜精品久久久久久99热软件| 在线免费观看羞羞视频一区二区| 国产精品久久久久999| 精品亚洲永久免费精品| 久久久久久免费精品| 精品久久久久久久久国产字幕| 欧美黑人巨大xxx极品| 日韩电影免费在线观看中文字幕| 亚洲香蕉在线观看| 韩国国内大量揄拍精品视频| 久久精品国产久精国产思思| 欧美成人免费全部观看天天性色| 国产精品美女主播在线观看纯欲| 一区二区三区日韩在线| 欧美国产高跟鞋裸体秀xxxhd| 欧美日韩综合视频| 欧美亚洲激情在线| 国产成人亚洲综合91| www.欧美免费| 国产精品久久久久久久久粉嫩av| 亚洲视频网站在线观看| 国产性色av一区二区| 国产精品大陆在线观看| 欧美中文字幕在线视频| 精品国产乱码久久久久久天美| 中文字幕一区二区三区电影| 日韩hd视频在线观看| 欧美成人精品h版在线观看| 国产成+人+综合+亚洲欧洲| 成人激情黄色网| 77777亚洲午夜久久多人| 欧美激情小视频| 亚洲精品www久久久| 国产97色在线|日韩| 美女999久久久精品视频| 国产在线视频不卡| 91国内在线视频| 中文字幕欧美视频在线| 97精品在线观看| 欧美激情国产日韩精品一区18| 亚洲国产精品成人精品| 91欧美精品成人综合在线观看| 国产精品美女久久久久久免费| 日韩有码在线电影| 亚洲欧美制服综合另类| 在线日韩欧美视频| 欧美一级片免费在线| 精品成人国产在线观看男人呻吟| 日韩av片免费在线观看| 日韩高清欧美高清| 国产suv精品一区二区三区88区| 欧美国产第一页| 亚洲美女性视频| 亚洲激情成人网| 91精品国产免费久久久久久| 欧美性猛交xxxx乱大交3| 国产精品女视频| 日韩精品丝袜在线| 91精品综合视频| 久久精品91久久香蕉加勒比| 国产日本欧美一区二区三区在线| 久久久久久久999精品视频| 日韩在线视频播放| 日韩h在线观看| 久久精品成人动漫| 久久久久久噜噜噜久久久精品| 日本19禁啪啪免费观看www| 最近2019年中文视频免费在线观看| 欧美性猛交xxxx免费看漫画| 久操成人在线视频| 97视频在线观看亚洲| 日韩一区二区三区在线播放| 一区二区三区视频观看| 欧美一区二区影院| 午夜免费在线观看精品视频| 国产乱人伦真实精品视频| 成人欧美一区二区三区黑人孕妇| 国产精品视频一区二区高潮| 91高潮在线观看| 日韩免费精品视频| 国模极品一区二区三区| 2020国产精品视频| 日本精品在线视频| 最近2019年好看中文字幕视频| 国内精品视频久久| 国产美女精彩久久| 亚洲成人av在线| 色综久久综合桃花网| 国产精品视频中文字幕91| 日韩精品极品毛片系列视频| 欧美极品少妇xxxxⅹ喷水| 自拍偷拍亚洲在线| 精品无人区乱码1区2区3区在线| 国产综合在线看| 成人黄色在线观看| 欧美一区二区三区……| 日本精品视频在线观看|