在oracle中,分區(qū)表是將大表分解為多個(gè)小的、可管理的分區(qū)表,每個(gè)分區(qū)表之間相互獨(dú)立,共同構(gòu)成了完整的表,邏輯上講只有一個(gè)表或一個(gè)索引,但在物理上這個(gè)表或索引可能由數(shù)個(gè)物理分區(qū)組成;分區(qū)表可以分為范圍分區(qū)、列表分區(qū)、哈希分區(qū)和組合分區(qū)。
本教程操作環(huán)境:windows10系統(tǒng)、Oracle 11g版、Dell G3電腦。
oracle中什么是分區(qū)表
(1)什么是分區(qū)
在Oracle數(shù)據(jù)庫中,為了提升對大表/大索引的可管理性、可維護(hù)性以及性能,Oracle引入了分區(qū)表機(jī)制,可以將大表/大索引分解為多個(gè)小的、可管理的分區(qū)。多個(gè)分區(qū)相對獨(dú)立,有獨(dú)立的存儲結(jié)構(gòu),共同構(gòu)成了整個(gè)完整的表/索引。分區(qū)對應(yīng)用透明,即對訪問數(shù)據(jù)庫的應(yīng)用而言,邏輯上講只有一個(gè)表或一個(gè)索引(相當(dāng)于應(yīng)用看到的仍然只是一個(gè)表或索引),但在物理上這個(gè)表或索引可能由數(shù)個(gè)物理分區(qū)組成。
(2)什么時(shí)候需要分區(qū)
Oracle官網(wǎng)的建議以下情形采用分區(qū)表:
? 1. 表數(shù)據(jù)量大于2GB時(shí)應(yīng)該考慮使用分區(qū);
? 2. 新數(shù)據(jù)加入至最新分區(qū)中的用于存儲歷史數(shù)據(jù)的表。
(3)分表和分區(qū)表的區(qū)別
為了分散存儲大表/索引的數(shù)據(jù),另外一種途徑是分表,分表是將一個(gè)大表按照一定的規(guī)則分解成多張具有獨(dú)立存儲空間的實(shí)體表,例如可以將客戶表customer拆分成兩個(gè)表,一個(gè)用于存儲個(gè)人客戶 customer_person,另一個(gè)存儲對公客戶 customer_company。分表完全獨(dú)立,在邏輯上是多張不同的表,而分區(qū)表在物理上是一張表。分區(qū)表對應(yīng)用透明易于管理維護(hù),分表不易于管理維護(hù)。
(4)分區(qū)表的類型
-
范圍分區(qū)(Range Partitioning)
-
列表分區(qū)(List Partitioning)
-
哈希分區(qū)(Hash Partitioning)
-
組合分區(qū)(Composite Partitioning)
基本分區(qū)是指僅僅使用了一層分區(qū)(范圍分區(qū)、列表分區(qū)、哈希分區(qū))的分區(qū)表。
如果對分區(qū)表進(jìn)行多層級的分區(qū),則稱為組合分區(qū)。
范圍分區(qū)表
(1)分區(qū)鍵
分區(qū)是將非常大的表或者索引分解成多個(gè)小的、可管理的部分。分區(qū)表是通過分區(qū)鍵來分解分區(qū)的。分區(qū)鍵決定了分區(qū)表中的每一行數(shù)據(jù)流向哪個(gè)分區(qū)。分區(qū)表中的每一行數(shù)據(jù)根據(jù)分區(qū)鍵,隱式地被分配到一個(gè)分區(qū)中。
(2)范圍分區(qū)
范圍分區(qū)按照分區(qū)鍵,根據(jù)數(shù)據(jù)行落在分區(qū)鍵中不同的范圍值來劃分分區(qū)。
(3)案例1(分區(qū)鍵為單列)
CREATE?TABLE?time_range_sales ?????(?prod_id????????NUMBER(6) ???????,?cust_id????????NUMBER ???????,?time_id????????DATE ???????,?channel_id?????CHAR(1) ???????,?promo_id???????NUMBER(6) ???????,?quantity_sold??NUMBER(3) ???????,?amount_sold????NUMBER(10,2) ?????) ????PARTITION?BY?RANGE?(time_id) ????(PARTITION?SALES_1998?VALUES?LESS?THAN?(TO_DATE('01-JAN-1999','DD-MON-YYYY')), ?????PARTITION?SALES_1999?VALUES?LESS?THAN?(TO_DATE('01-JAN-2000','DD-MON-YYYY')), ?????PARTITION?SALES_2000?VALUES?LESS?THAN?(TO_DATE('01-JAN-2001','DD-MON-YYYY')), ?????PARTITION?SALES_2001?VALUES?LESS?THAN?(MAXVALUE) ????);
推薦教程:《Oracle視頻教程》