ORACLE 分區(qū)表的設(shè)計(jì)
更新時(shí)間:2009年08月13日 15:08:24 作者:
分區(qū)致力于解決支持極大表和索引的關(guān)鍵問(wèn)題。它采用他們分解成較小和易于管理的稱為分區(qū)的片(piece)的方法。
分區(qū)表的概念
分區(qū)致力于解決支持極大表和索引的關(guān)鍵問(wèn)題。它采用他們分解成較小和易于管理的稱為分區(qū)的片(piece)的方法。一旦分區(qū)被定義,SQL語(yǔ)句就可以訪問(wèn)的操作某一個(gè)分區(qū)而不是整個(gè)表,因而提高管理的效率。分區(qū)對(duì)于數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用程序非常有效,因?yàn)樗麄兂34鎯?chǔ)和分析巨量的歷史數(shù)據(jù)。
分區(qū)表的分類
Range partitioning(范圍分區(qū))
Hash partitioning(哈希分區(qū))
List partitioning(列表分區(qū))
Composite range-hash partitioning(范圍-哈希組合分區(qū))
Composite range-list partitioning(范圍-列表組合分區(qū))
何時(shí)選擇范圍分區(qū)
必須可以將表的記錄按照某一列值的范圍進(jìn)行劃分。你想處理一些數(shù)據(jù),這些數(shù)據(jù)經(jīng)常是屬于某一個(gè)范圍內(nèi),例如月份。如果數(shù)據(jù)能夠按照分區(qū)的范圍均勻分布的話,那會(huì)獲得最佳性能。如果數(shù)據(jù)分布很不均勻的話,你可能不得不選擇其他分區(qū)方式。
CREATE TABLE sales
( invoice_no NUMBER,
sale_year INT NOT NULL,
sale_month INT NOT NULL,
sale_day INT NOT NULL )
PARTITION BY RANGE (sale_year, sale_month, sale_day)
( PARTITION sales_q1 VALUES LESS THAN (1999, 04, 01)
TABLESPACE tsa,
PARTITION sales_q2 VALUES LESS THAN (1999, 07, 01)
TABLESPACE tsb,
PARTITION sales_q3 VALUES LESS THAN (1999, 10, 01)
TABLESPACE tsc,
PARTITION sales_q4 VALUES LESS THAN (2000, 01, 01)
TABLESPACE tsd );
何時(shí)選擇HASH分區(qū)
如果數(shù)據(jù)不容易用范圍分區(qū),但你想提升性能和表的易管理性。 Hash分區(qū)提供了一個(gè)在指定數(shù)量的分區(qū)內(nèi)交叉均勻分布數(shù)據(jù)的方法。行根據(jù)分區(qū)鍵的hash值映射到相應(yīng)分區(qū)中。創(chuàng)建和使用hash分區(qū)你可以靈活放置數(shù)據(jù),可以通過(guò)交叉訪問(wèn)在不同I/O設(shè)備上的分區(qū)提升性能。
CREATE TABLE scubagear (id NUMBER, name VARCHAR2 (60))
PARTITION BY HASH (id)
PARTITIONS 4 STORE IN (gear1, gear2, gear3, gear4);
何時(shí)選擇列表分區(qū)
使用LIST分區(qū)你可以直接控制某些數(shù)據(jù)映射到某些分區(qū)。你可以為某個(gè)分區(qū)指定不連續(xù)的分區(qū)鍵值。這不同于RANGE分區(qū)(用鍵值的范圍劃分分區(qū)),也不同于HASH分區(qū)(不能控制某行映射到哪個(gè)分區(qū))。
CREATE TABLE q1_sales_by_region
(deptno number, deptname varchar2(20), quarterly_sales number(10, 2), state varchar2(2))
PARTITION BY LIST (state)
(PARTITION q1_northwest VALUES ('OR', 'WA'),
PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'),
PARTITION q1_northeast VALUES ('NY', 'VM', 'NJ'),
PARTITION q1_southeast VALUES ('FL', 'GA'),
PARTITION q1_northcentral VALUES ('SD', 'WI'),
PARTITION q1_southcentral VALUES ('OK', 'TX'));
分區(qū)表的設(shè)計(jì)
如何選擇分區(qū)的類型,如何選擇分區(qū)的列呢?在這之前你必須明確你的目的——易管理性和性能,你更注重哪個(gè)方面?分區(qū)表所影響的方面可以歸類為以下幾種:性能、易管理性、數(shù)據(jù)清理。
下面分別說(shuō)說(shuō)分區(qū)表對(duì)每一項(xiàng)的具體影響,
性能:
這一般是分區(qū)的主要目的。分區(qū)將大表變成了小表,當(dāng)where之后的條件體現(xiàn)分區(qū)字段的具體值時(shí),避免了全表掃描。
易于管理:
對(duì)于包含海量數(shù)據(jù)的大表,分區(qū)帶來(lái)的易于管理性是非常明顯的。當(dāng)你建議一個(gè)基于非分區(qū)表的索引時(shí),唯一的選擇就是創(chuàng)建整個(gè)索引。如果表被分區(qū),你就可以根據(jù)分區(qū)并行為此表創(chuàng)建索引,例如:
alter index par_ind_01 reuild partition yy05;
除此之外你還可以同時(shí)的做很多事情,像改變表所在表空間、導(dǎo)出表,刪除表數(shù)據(jù)等等。
數(shù)據(jù)清理:
我們經(jīng)常會(huì)需要?jiǎng)h除表的一些歷史數(shù)據(jù),一般做法是delete,但是這會(huì)導(dǎo)致undo和redo的信息快速增長(zhǎng),而且影響數(shù)據(jù)庫(kù)整體性能。這時(shí)我們就可以利用drop某個(gè)分區(qū)來(lái)完成此任務(wù),例如:
alter table tab_a drop partition yy01;
當(dāng)一個(gè)表的分區(qū)被刪除,對(duì)應(yīng)的local索引也同時(shí)被刪除。如果還存在著global索引,那么它會(huì)變成unusable狀態(tài)。為了避免此事情的發(fā)生,你可以使用:
alter table tab_a drop partition yy01 update global indexes;
分區(qū)致力于解決支持極大表和索引的關(guān)鍵問(wèn)題。它采用他們分解成較小和易于管理的稱為分區(qū)的片(piece)的方法。一旦分區(qū)被定義,SQL語(yǔ)句就可以訪問(wèn)的操作某一個(gè)分區(qū)而不是整個(gè)表,因而提高管理的效率。分區(qū)對(duì)于數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用程序非常有效,因?yàn)樗麄兂34鎯?chǔ)和分析巨量的歷史數(shù)據(jù)。
分區(qū)表的分類
Range partitioning(范圍分區(qū))
Hash partitioning(哈希分區(qū))
List partitioning(列表分區(qū))
Composite range-hash partitioning(范圍-哈希組合分區(qū))
Composite range-list partitioning(范圍-列表組合分區(qū))
何時(shí)選擇范圍分區(qū)
必須可以將表的記錄按照某一列值的范圍進(jìn)行劃分。你想處理一些數(shù)據(jù),這些數(shù)據(jù)經(jīng)常是屬于某一個(gè)范圍內(nèi),例如月份。如果數(shù)據(jù)能夠按照分區(qū)的范圍均勻分布的話,那會(huì)獲得最佳性能。如果數(shù)據(jù)分布很不均勻的話,你可能不得不選擇其他分區(qū)方式。
CREATE TABLE sales
( invoice_no NUMBER,
sale_year INT NOT NULL,
sale_month INT NOT NULL,
sale_day INT NOT NULL )
PARTITION BY RANGE (sale_year, sale_month, sale_day)
( PARTITION sales_q1 VALUES LESS THAN (1999, 04, 01)
TABLESPACE tsa,
PARTITION sales_q2 VALUES LESS THAN (1999, 07, 01)
TABLESPACE tsb,
PARTITION sales_q3 VALUES LESS THAN (1999, 10, 01)
TABLESPACE tsc,
PARTITION sales_q4 VALUES LESS THAN (2000, 01, 01)
TABLESPACE tsd );
何時(shí)選擇HASH分區(qū)
如果數(shù)據(jù)不容易用范圍分區(qū),但你想提升性能和表的易管理性。 Hash分區(qū)提供了一個(gè)在指定數(shù)量的分區(qū)內(nèi)交叉均勻分布數(shù)據(jù)的方法。行根據(jù)分區(qū)鍵的hash值映射到相應(yīng)分區(qū)中。創(chuàng)建和使用hash分區(qū)你可以靈活放置數(shù)據(jù),可以通過(guò)交叉訪問(wèn)在不同I/O設(shè)備上的分區(qū)提升性能。
CREATE TABLE scubagear (id NUMBER, name VARCHAR2 (60))
PARTITION BY HASH (id)
PARTITIONS 4 STORE IN (gear1, gear2, gear3, gear4);
何時(shí)選擇列表分區(qū)
使用LIST分區(qū)你可以直接控制某些數(shù)據(jù)映射到某些分區(qū)。你可以為某個(gè)分區(qū)指定不連續(xù)的分區(qū)鍵值。這不同于RANGE分區(qū)(用鍵值的范圍劃分分區(qū)),也不同于HASH分區(qū)(不能控制某行映射到哪個(gè)分區(qū))。
CREATE TABLE q1_sales_by_region
(deptno number, deptname varchar2(20), quarterly_sales number(10, 2), state varchar2(2))
PARTITION BY LIST (state)
(PARTITION q1_northwest VALUES ('OR', 'WA'),
PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'),
PARTITION q1_northeast VALUES ('NY', 'VM', 'NJ'),
PARTITION q1_southeast VALUES ('FL', 'GA'),
PARTITION q1_northcentral VALUES ('SD', 'WI'),
PARTITION q1_southcentral VALUES ('OK', 'TX'));
分區(qū)表的設(shè)計(jì)
如何選擇分區(qū)的類型,如何選擇分區(qū)的列呢?在這之前你必須明確你的目的——易管理性和性能,你更注重哪個(gè)方面?分區(qū)表所影響的方面可以歸類為以下幾種:性能、易管理性、數(shù)據(jù)清理。
下面分別說(shuō)說(shuō)分區(qū)表對(duì)每一項(xiàng)的具體影響,
性能:
這一般是分區(qū)的主要目的。分區(qū)將大表變成了小表,當(dāng)where之后的條件體現(xiàn)分區(qū)字段的具體值時(shí),避免了全表掃描。
易于管理:
對(duì)于包含海量數(shù)據(jù)的大表,分區(qū)帶來(lái)的易于管理性是非常明顯的。當(dāng)你建議一個(gè)基于非分區(qū)表的索引時(shí),唯一的選擇就是創(chuàng)建整個(gè)索引。如果表被分區(qū),你就可以根據(jù)分區(qū)并行為此表創(chuàng)建索引,例如:
alter index par_ind_01 reuild partition yy05;
除此之外你還可以同時(shí)的做很多事情,像改變表所在表空間、導(dǎo)出表,刪除表數(shù)據(jù)等等。
數(shù)據(jù)清理:
我們經(jīng)常會(huì)需要?jiǎng)h除表的一些歷史數(shù)據(jù),一般做法是delete,但是這會(huì)導(dǎo)致undo和redo的信息快速增長(zhǎng),而且影響數(shù)據(jù)庫(kù)整體性能。這時(shí)我們就可以利用drop某個(gè)分區(qū)來(lái)完成此任務(wù),例如:
alter table tab_a drop partition yy01;
當(dāng)一個(gè)表的分區(qū)被刪除,對(duì)應(yīng)的local索引也同時(shí)被刪除。如果還存在著global索引,那么它會(huì)變成unusable狀態(tài)。為了避免此事情的發(fā)生,你可以使用:
alter table tab_a drop partition yy01 update global indexes;
相關(guān)文章
ORACLE數(shù)據(jù)庫(kù)應(yīng)用開發(fā)常見問(wèn)題及排除
ORACLE數(shù)據(jù)庫(kù)應(yīng)用開發(fā)常見問(wèn)題及排除...2007-03-03
oracle的導(dǎo)入導(dǎo)出注意事項(xiàng)及心得分享
導(dǎo)入導(dǎo)出oracle方案是備份和恢復(fù)的主旋律,有一點(diǎn)點(diǎn)在使用過(guò)程中的體會(huì),在此與大家分享下,希望對(duì)大家有所幫助2013-09-09
Oracle中sql語(yǔ)句(+)符號(hào)代表連接的使用講解
今天小編就為大家分享一篇關(guān)于Oracle中sql語(yǔ)句(+)符號(hào)代表連接的使用講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Oracle?Expdp按條件導(dǎo)出指定表數(shù)據(jù)的方法實(shí)例
這篇文章主要介紹了Oracle的expdp數(shù)據(jù)泵方式導(dǎo)出特定機(jī)構(gòu)和時(shí)間范圍的數(shù)據(jù),并通過(guò)parfile文件進(jìn)行條件限制和配置,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
oracle 取某個(gè)時(shí)間段的數(shù)據(jù)(每周幾的上午幾點(diǎn)到幾點(diǎn))
這篇文章主要介紹了oracle 取某個(gè)時(shí)間的數(shù)據(jù)(每周幾的上午幾點(diǎn)到幾點(diǎn)),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Oracle數(shù)據(jù)庫(kù)丟失表排查思路實(shí)戰(zhàn)記錄
相信大家無(wú)論是開發(fā)、測(cè)試還是運(yùn)維過(guò)程中,都可能會(huì)因?yàn)檎`操作、連錯(cuò)數(shù)據(jù)庫(kù)、用錯(cuò)用戶、語(yǔ)句條件有誤等原因,導(dǎo)致錯(cuò)誤刪除、錯(cuò)誤更新等問(wèn)題,這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)丟失表排查思路的相關(guān)資料,需要的朋友可以參考下2022-06-06

