1. 程式人生 > >Oracle表分割槽分為四種:範圍分割槽,雜湊分割槽,列表分割槽和複合分割槽

Oracle表分割槽分為四種:範圍分割槽,雜湊分割槽,列表分割槽和複合分割槽

一:範圍分割槽

就是根據資料庫表中某一欄位的值的範圍來劃分分割槽,例如:

Sql程式碼  收藏程式碼

  1. create table graderecord  
  2.   (  
  3.   sno varchar2(10),  
  4.   sname varchar2(20),  
  5.   dormitory varchar2(3),  
  6.   grade int  
  7. )  
  8. partition by range(grade)  
  9. (  
  10.   partition bujige values less than(60), --不及格  
  11.   partition jige values less than(85), --及格  
  12.   partition youxiu values less than(maxvalue) --優秀  
  13. )  

 插入實驗資料:

Sql程式碼  收藏程式碼

  1. insert into graderecord values('511601','魁','229',92);  
  2. insert into graderecord values('511602','凱','229',62);  
  3. insert into graderecord values('511603','東','229',26);  
  4. insert into graderecord values('511604','亮','228',77);  
  5. insert into graderecord values('511605','敬','228',47);  
  6. insert into graderecord(sno,sname,dormitory) values('511606','峰','228');  
  7. insert into graderecord values('511607','明','240',90);  
  8. insert into graderecord values('511608','楠','240',100);  
  9. insert into graderecord values('511609','濤','240',67);  
  10. insert into graderecord values('511610','博','240',75);  
  11. insert into graderecord values('511611','錚','240',60);  

 下面查詢一下全部資料,然後查詢各個分割槽資料,程式碼一起寫:

Java程式碼  收藏程式碼

  1. select * from graderecord;  
  2. select * from graderecord partition(bujige);  
  3. select * from graderecord partition(jige);  
  4. select * from graderecord partition(youxiu);  

 全部資料如下:

 

不及格資料如下:

 

及格資料如下:

 

優秀資料如下:

 

說明:資料中有空值,Oracle機制會自動將其規劃到maxvalue的分割槽中。

 

二:雜湊分割槽

雜湊分割槽是根據欄位的hash值進行均勻分佈,儘可能的實現各分割槽所雜湊的資料相等。

還是剛才那個表,只不過把範圍分割槽改換為雜湊分割槽,語法如下(刪除表之後重建):

Sql程式碼  收藏程式碼

  1. create table graderecord  
  2. (  
  3.   sno varchar2(10),  
  4.   sname varchar2(20),  
  5.   dormitory varchar2(3),  
  6.   grade int  
  7. )  
  8. partition by hash(sno)  
  9. (  
  10.   partition p1,  
  11.   partition p2,  
  12.   partition p3  
  13. );  

插入實驗資料,與範圍分割槽實驗插入的資料相同。

然後查詢分割槽資料:

Sql程式碼  收藏程式碼

  1. select * from graderecord partition(p1);  
  2. select * from graderecord partition(p2);  
  3. select * from graderecord partition(p3);  

 p1分割槽的資料:

 

p2分割槽的資料:

 

p3分割槽的資料:

 

說明:雜湊分割槽即為雜湊分割槽,Oracle採用雜湊碼技術分割槽,具體分割槽如何由Oracle說的算,也可能我下一次搜尋就不是這個資料了。

 

三:列表分割槽

列表分割槽明確指定了根據某欄位的某個具體值進行分割槽,而不是像範圍分割槽那樣根據欄位的值範圍來劃分的。

Sql程式碼  收藏程式碼

  1. create table graderecord  
  2. (  
  3.   sno varchar2(10),  
  4.   sname varchar2(20),  
  5.   dormitory varchar2(3),  
  6.   grade int  
  7. )  
  8. partition by list(dormitory)  
  9. (  
  10.   partition d229 values('229'),  
  11.   partition d228 values('228'),  
  12.   partition d240 values('240')  
  13. )  

 以上根據宿舍來進行列表分割槽,插入與範圍分割槽實驗相同的資料,做查詢如下:

Sql程式碼  收藏程式碼

  1. select * from graderecord partition(d229);  
  2. select * from graderecord partition(d228);  
  3. select * from graderecord partition(d240);  

 d229分割槽所得資料如下:

 

d228分割槽所得資料如下:

 

d240分割槽所得資料如下:

 

四:複合分割槽 (範圍-雜湊分割槽,範圍-列表分割槽)

首先講範圍-雜湊分割槽。先宣告一下:列表分割槽不支援多列,但是範圍分割槽和雜湊分割槽支援多列。

程式碼如下:

Sql程式碼  收藏程式碼

  1. create table graderecord  
  2. (  
  3.   sno varchar2(10),  
  4.   sname varchar2(20),  
  5.   dormitory varchar2(3),  
  6.   grade int  
  7. )  
  8. partition by range(grade)  
  9. subpartition by hash(sno,sname)  
  10. (  
  11.   partition p1 values less than(75)  
  12.             (  
  13.                subpartition sp1,subpartition sp2  
  14.             ),  
  15.   partition p2 values less than(maxvalue)  
  16.             (  
  17.                subpartition sp3,subpartition sp4  
  18.             )  
  19. );  

 以grade劃分範圍,然後以sno和sname劃分雜湊分割槽,當資料量大的時候雜湊分割槽則趨於“平均”。

插入資料:

Sql程式碼  收藏程式碼

  1. insert into graderecord values('511601','魁','229',92);  
  2. insert into graderecord values('511602','凱','229',62);  
  3. insert into graderecord values('511603','東','229',26);  
  4. insert into graderecord values('511604','亮','228',77);  
  5. insert into graderecord values('511605','敬','228',47);  
  6. insert into graderecord(sno,sname,dormitory) values('511606','峰','228');  
  7. insert into graderecord values('511607','明','240',90);  
  8. insert into graderecord values('511608','楠','240',100);  
  9. insert into graderecord values('511609','濤','240',67);  
  10. insert into graderecord values('511610','博','240',75);  
  11. insert into graderecord values('511611','錚','240',60);  
  12. insert into graderecord values('511612','狸','244',72);  
  13. insert into graderecord values('511613','傑','244',88);  
  14. insert into graderecord values('511614','萎','244',19);  
  15. insert into graderecord values('511615','猥','244',65);  
  16. insert into graderecord values('511616','丹','244',59);  
  17. insert into graderecord values('511617','靳','244',95);  

 查詢如下:

Sql程式碼  收藏程式碼

  1. select * from graderecord partition(p1);  
  2. select * from graderecord partition(p2);  
  3. select * from graderecord subpartition(sp1);  
  4. select * from graderecord subpartition(sp2);  
  5. select * from graderecord subpartition(sp3);  
  6. select * from graderecord subpartition(sp4);  

 分割槽p1資料如下,本例中75分以下:

 

分割槽p2資料如下,本例中75分之上包括75分:

 

子分割槽sp1:

 

子分割槽sp2:

 

子分割槽sp3:

 

子分割槽sp4:

 

說明:當資料量越來越大時,雜湊分割槽的分割槽表中資料越來越趨於平衡。

 

下面講範圍-列表分割槽

範圍-列表分割槽有兩種創立方式,先說說沒有模板的建立方式,這個表我要重建:

Sql程式碼  收藏程式碼

  1. create table MobileMessage  
  2. (  
  3.  ACCT_MONTH VARCHAR2(6), -- 帳期 格式:年月 YYYYMM  
  4.  AREA_NO VARCHAR2(10), -- 地域號碼   
  5.  DAY_ID VARCHAR2(2), -- 本月中的第幾天 格式 DD  
  6.  SUBSCRBID VARCHAR2(20), -- 使用者標識   
  7.  SVCNUM VARCHAR2(30) -- 手機號碼  
  8. )  
  9. partition by range(ACCT_MONTH,AREA_NO) subpartition by list(DAY_ID)  
  10. (  
  11.   partition p1 values less than('200705','012')  
  12.   (  
  13.     subpartition shangxun1 values('01','02','03','04','05','06','07','08','09','10'),  
  14.     subpartition zhongxun1 values('11','12','13','14','15','16','17','18','19','20'),  
  15.     subpartition xiaxun1 values('21','22','23','24','25','26','27','28','29','30','31')  
  16.   ),  
  17.   partition p2 values less than('200709','014')  
  18.   (  
  19.     subpartition shangxun2 values('01','02','03','04','05','06','07','08','09','10'),  
  20.     subpartition zhongxun2 values('11','12','13','14','15','16','17','18','19','20'),  
  21.     subpartition xiaxun2 values('21','22','23','24','25','26','27','28','29','30','31')  
  22.   ),  
  23.   partition p3 values less than('200801','016')  
  24.   (  
  25.     subpartition shangxun3 values('01','02','03','04','05','06','07','08','09','10'),  
  26.     subpartition zhongxun3 values('11','12','13','14','15','16','17','18','19','20'),  
  27.     subpartition xiaxun3 values('21','22','23','24','25','26','27','28','29','30','31')  
  28.   )  
  29. )  

 插入實驗資料:

Sql程式碼  收藏程式碼

  1. insert into MobileMessage values('200701','010','04','ghk001','13800000000');  
  2. insert into MobileMessage values('200702','015','12','myx001','13633330000');  
  3. insert into MobileMessage values('200703','015','24','hjd001','13300000000');  
  4. insert into MobileMessage values('200704','010','04','ghk001','13800000000');  
  5. insert into MobileMessage values('200705','010','04','ghk001','13800000000');  
  6. insert into MobileMessage values('200705','011','18','sxl001','13222000000');  
  7. insert into MobileMessage values('200706','011','21','sxl001','13222000000');  
  8. insert into MobileMessage values('200706','012','11','tgg001','13800044400');  
  9. insert into MobileMessage values('200707','010','04','ghk001','13800000000');  
  10. insert into MobileMessage values('200708','012','24','tgg001','13800044400');  
  11. insert into MobileMessage values('200709','014','29','zjj001','13100000000');  
  12. insert into MobileMessage values('200710','014','29','zjj001','13100000000');  
  13. insert into MobileMessage values('200711','014','29','zjj001','13100000000');  
  14. insert into MobileMessage values('200711','013','30','wgc001','13444000000');  
  15. insert into MobileMessage values('200712','013','30','wgc001','13444000000');  
  16. insert into MobileMessage values('200712','010','30','ghk001','13800000000');  
  17. insert into MobileMessage values('200801','015','22','myx001','13633330000');  

 查詢結果如下:

Sql程式碼  收藏程式碼

  1. select * from MobileMessage;  

 

 

分割槽p1查詢結果如下:

 

分割槽p2查詢結果如下:

 

子分割槽xiaxun2查詢結果如下:

 

說明:範圍分割槽 range(A,B)的分割槽法則,範圍分割槽都是 values less than(A,B)的,通常情況下以A為準,如果小於A的不用考慮B,直接插進去,如果等於A那麼考慮B,要是滿足B的話也插進去。

 

另一種範圍-列表分割槽,包含模板的(比較繁瑣,但是更加精確,處理海量儲存資料十分必要):

Sql程式碼  收藏程式碼

  1. create table MobileMessage  
  2. (  
  3.  ACCT_MONTH VARCHAR2(6), -- 帳期 格式:年月 YYYYMM  
  4.  AREA_NO VARCHAR2(10), -- 地域號碼  
  5.  DAY_ID VARCHAR2(2), -- 本月中的第幾天 格式 DD  
  6.  SUBSCRBID VARCHAR2(20), -- 使用者標識   
  7.  SVCNUM VARCHAR2(30) -- 手機號碼  
  8. )  
  9. partition by range(ACCT_MONTH,AREA_NO) subpartition by list(DAY_ID)  
  10. subpartition template  
  11. (  
  12.  subpartition sub1 values('01'),subpartition sub2 values('02'),  
  13.  subpartition sub3 values('03'),subpartition sub4 values('04'),  
  14.  subpartition sub5 values('05'),subpartition sub6 values('06'),  
  15.  subpartition sub7 values('07'),subpartition sub8 values('08'),  
  16.  subpartition sub9 values('09'),subpartition sub10 values('10'),  
  17.  subpartition sub11 values('11'),subpartition sub12 values('12'),  
  18.  subpartition sub13 values('13'),subpartition sub14 values('14'),  
  19.  subpartition sub15 values('15'),subpartition sub16 values('16'),  
  20.  subpartition sub17 values('17'),subpartition sub18 values('18'),  
  21.  subpartition sub19 values('19'),subpartition sub20 values('20'),  
  22.  subpartition sub21 values('21'),subpartition sub22 values('22'),  
  23.  subpartition sub23 values('23'),subpartition sub24 values('24'),  
  24.  subpartition sub25 values('25'),subpartition sub26 values('26'),  
  25.  subpartition sub27 values('27'),subpartition sub28 values('28'),  
  26.  subpartition sub29 values('29'),subpartition sub30 values('30'),  
  27.  subpartition sub31 values('31')  
  28. )  
  29. (  
  30.   partition p_0701_010 values less than('200701','011'),  
  31.   partition p_0701_011 values less than('200701','012'),  
  32.   partition p_0701_012 values less than('200701','013'),  
  33.   partition p_0701_013 values less than('200701','014'),  
  34.   partition p_0701_014 values less than('200701','015'),  
  35.   partition p_0701_015 values less than('200701','016'),  
  36.   partition p_0702_010 values less than('200702','011'),  
  37.   partition p_0702_011 values less than('200702','012'),  
  38.   partition p_0702_012 values less than('200702','013'),  
  39.   partition p_0702_013 values less than('200702','014'),  
  40.   partition p_0702_014 values less than('200702','015'),  
  41.   partition p_0702_015 values less than('200702','016'),  
  42.   partition p_0703_010 values less than('200703','011'),  
  43.   partition p_0703_011 values less than('200703','012'),  
  44.   partition p_0703_012 values less than('200703','013'),  
  45.   partition p_0703_013 values less than('200703','014'),  
  46.   partition p_0703_014 values less than('200703','015'),  
  47.   partition p_0703_015 values less than('200703','016'),    
  48.   partition p_0704_010 values less than('200704','011'),  
  49.   partition p_0704_011 values less than('200704','012'),  
  50.   partition p_0704_012 values less than('200704','013'),  
  51.   partition p_0704_013 values less than('200704','014'),  
  52.   partition p_0704_014 values less than('200704','015'),  
  53.   partition p_0704_015 values less than('200704','016'),    
  54.   partition p_0705_010 values less than('200705','011'),  
  55.   partition p_0705_011 values less than('200705','012'),  
  56.   partition p_0705_012 values less than('200705','013'),  
  57.   partition p_0705_013 values less than('200705','014'),  
  58.   partition p_0705_014 values less than('200705','015'),  
  59.   partition p_0705_015 values less than('200705','016'),    
  60.   partition p_0706_010 values less than('200706','011'),  
  61.   partition p_0706_011 values less than('200706','012'),  
  62.   partition p_0706_012 values less than('200706','013'),  
  63.   partition p_0706_013 values less than('200706','014'),  
  64.   partition p_0706_014 values less than('200706','015'),  
  65.   partition p_0706_015 values less than('200706','016'),    
  66.   partition p_0707_010 values less than('200707','011'),  
  67.   partition p_0707_011 values less than('200707','012'),  
  68.   partition p_0707_012 values less than('200707','013'),  
  69.   partition p_0707_013 values less than('200707','014'),  
  70.   partition p_0707_014 values less than('200707','015'),  
  71.   partition p_0707_015 values less than('200707','016'),    
  72.   partition p_0708_010 values less than('200708','011'),  
  73.   partition p_0708_011 values less than('200708','012'),  
  74.   partition p_0708_012 values less than('200708','013'),  
  75.   partition p_0708_013 values less than('200708','014'),  
  76.   partition p_0708_014 values less than('200708','015'),  
  77.   partition p_0708_015 values less than('200708','016'),    
  78.   partition p_0709_010 values less than('200709','011'),  
  79.   partition p_0709_011 values less than('200709','012'),  
  80.   partition p_0709_012 values less than('200709','013'),  
  81.   partition p_0709_013 values less than('200709','014'),  
  82.   partition p_0709_014 values less than('200709','015'),  
  83.   partition p_0709_015 values less than('200709','016'),    
  84.   partition p_0710_010 values less than('200710','011'),  
  85.   partition p_0710_011 values less than('200710','012'),  
  86.   partition p_0710_012 values less than('200710','013'),  
  87.   partition p_0710_013 values less than('200710','014'),  
  88.   partition p_0710_014 values less than('200710','015'),  
  89.   partition p_0710_015 values less than('200710','016'),    
  90.   partition p_0711_010 values less than('200711','011'),  
  91.   partition p_0711_011 values less than('200711','012'),  
  92.   partition p_0711_012 values less than('200711','013'),  
  93.   partition p_0711_013 values less than('200711','014'),  
  94.   partition p_0711_014 values less than('200711','015'),  
  95.   partition p_0711_015 values less than('200711','016'),    
  96.   partition p_0712_010 values less than('200712','011'),  
  97.   partition p_0712_011 values less than('200712','012'),  
  98.   partition p_0712_012 values less than('200712','013'),  
  99.   partition p_0712_013 values less than('200712','014'),  
  100.   partition p_0712_014 values less than('200712','015'),  
  101.   partition p_0712_015 values less than('200712','016'),    
  102.   partition p_0801_010 values less than('200801','011'),  
  103.   partition p_0801_011 values less than('200801','012'),  
  104.   partition p_0801_012 values less than('200801','013'),  
  105.   partition p_0801_013 values less than('200801','014'),  
  106.   partition p_0801_014 values less than('200801','015'),  
  107.   partition p_0801_015 values less than('200801','016'),    
  108.   partition p_other values less than(maxvalue, maxvalue)  
  109. );  

 這個是帶有模板子分割槽的,模板子分割槽詳細到月中的天。這種分割槽模式只要建立了分割槽就會自動建立子分割槽的。

插入上面不帶模板分割槽實驗相同的資料,隨機查詢分割槽資料:

 

查詢分割槽p_0701_010的資料:

Sql程式碼  收藏程式碼

  1. select * from MobileMessage partition(p_0701_010);  

 查詢結果:

 

查詢子分割槽p_0701_010_sub4的資料:

Sql程式碼  收藏程式碼

  1. select * from MobileMessage subpartition(p_0701_010_sub4);  

 查詢結果如下:

 

查詢分割槽p_0706_011的資料:

Sql程式碼  收藏程式碼

  1. select * from MobileMessage partition(p_0706_011);  

 查詢結果如下:

 

查詢子分割槽p_0706_011_sub21的資料:

Sql程式碼  收藏程式碼

  1. select * from MobileMessage subpartition(p_0706_011_sub21);  

 查詢結果如下:

 

下面講講分割槽的維護操作:

(1)分裂分割槽,以第一個範圍分割槽為例:

Sql程式碼  收藏程式碼

  1. alter table graderecord split partition jige at(75)   
  2.       into(partition keyi,partition lianghao);   

 把分割槽及格分裂為兩個分割槽:可以和良好。

 

(2)合併分割槽,以第一個範圍分割槽為例:

Sql程式碼  收藏程式碼

  1. alter table graderecord merge partitions keyi,lianghao   
  2. into partition jige;  

 把可以和良好兩個分割槽合併為及格。

 

(3)新增分割槽,由於在範圍分割槽上新增分割槽要求新增的分割槽範圍大於原有分割槽最大值,但原有分割槽最大值已經為maxvalue,故本處以第二個雜湊分割槽為例:

Sql程式碼  收藏程式碼

  1. alter table graderecord add partition p4;  

 給雜湊分割槽例子又增加了一個分割槽p4 。

 

(4)刪除分割槽,語法:

Sql程式碼  收藏程式碼

  1. alter table table_name drop partition partition_name;  

 

(5)截斷分割槽,清空分割槽中的資料

Sql程式碼  收藏程式碼

  1. alter table table_name truncate partition partition_name;  

 

說明:對待分割槽的操作同樣可以對待子分割槽,效果一樣。刪除一個分割槽會同時刪除其下的子分割槽。合併多個分割槽也會把他們的子分割槽自動合併。分裂分割槽時注意分裂點。

 

另外不帶模板子分割槽和帶有模板子分割槽的分割槽表操作的區別:帶有子分割槽模板的分割槽表在新增分割槽時候自動新增子分割槽,不帶模板子分割槽的分割槽表沒有這個功能;帶有子分割槽模板的分割槽表在更改分割槽時只需更改分割槽,不帶模板子分割槽的分割槽表在更改分割槽時一定注意連同子分割槽一起更改。

原文連結:https://blog.csdn.net/zy419547093/article/details/78436982?locationNum=5&fps=1