分區表通過對分區列進行判斷,把滿足不同條件的分區列對應的記錄保存在不同的分區中。
一、何為分區表
什么情況下會使用分區表?表中已有大量數據,或預計到表中將會保存大量的數據
可以按照預期(月份、區域、dml)對表中的數據執行查詢和更新
什么是分區鍵?
創建分區表,需要分區鍵;分區表的每一列都明確的歸屬一個分區,劃分的依據就是分區鍵。
有如下特點:由1~~16個列順序組成
不能包含Level、RowId、MisLabel偽列
不能包含為空的列
Oracle支持哪些類型的分區方式?范圍分區——將分區表中的記錄映射到基于分區鍵列值范圍的分區,例如:按照月份劃分
散列分區——基于分區鍵的散列值進行映射到分區中,也就是字段的hash值進行均勻分布,盡可能的實現各分區所散列的數據相等。
列表分區——根據分區鍵的值明確定義其歸屬的分區,例如:華北、東北等區塊
組合范圍-散列分區——范圍和散列的組合,例如:按月份對業績進行分區,并用散列分區
組合范圍-列表分區——范圍和列表的組合,例如:按月份對業績進行分區,并用地域分區
什么情況下使用分區表,在多大的數據量時?記錄數在1000w以上
表中數據有百萬,但每條記錄的數量比較大
二、應用場景
需求:信用卡消費流程
--創建用戶Credit
create?user?credit?identified?by?pwd?default?tablespace?users?temporary?tablespace?temp;
--向Credit授權
grant?create?session?to?credit;
grant?create?table?to?credit;
grant?create?sequence?to?credit;
grant?create?user,alter?user,drop?user?to?credit;
--向用戶credit授予表空間users的配額
alter?user?credit?quota?100M?on?users;
確定分區方案
首先需要確定分區的依據和分區的數量,針對信用卡可以按照consume_date進行分區
create?tablespace?creditTab1
datafile?'E:\app\Administrator\admin\orcl\creditDataFile01.dbf'?size?50M;
create?tablespace?creditTab2
datafile?'E:\app\Administrator\admin\orcl\creditDataFile02.dbf'?size?50M;
create?tablespace?creditTab3
datafile?'E:\app\Administrator\admin\orcl\creditDataFile03.dbf'?size?50M;
create?tablespace?creditTab4
datafile?'E:\app\Administrator\admin\orcl\creditDataFile04.dbf'?size?50M;
create?tablespace?creditTab5
datafile?'E:\app\Administrator\admin\orcl\creditDataFile05.dbf'?size?50M;
create?tablespace?creditTab6
datafile?'E:\app\Administrator\admin\orcl\creditDataFile06.dbf'?size?50M;
create?tablespace?creditTab7
datafile?'E:\app\Administrator\admin\orcl\creditDataFile07.dbf'?size?50M;
create?tablespace?creditTab8
datafile?'E:\app\Administrator\admin\orcl\creditDataFile08.dbf'?size?50M;
create?tablespace?creditTab9
datafile?'E:\app\Administrator\admin\orcl\creditDataFile09.dbf'?size?50M;
create?tablespace?creditTab10
datafile?'E:\app\Administrator\admin\orcl\creditDataFile10.dbf'?size?50M;
create?tablespace?creditTab11
datafile?'E:\app\Administrator\admin\orcl\creditDataFile11.dbf'?size?50M;
create?tablespace?creditTab12
datafile?'E:\app\Administrator\admin\orcl\creditDataFile12.dbf'?size?50M;--向用戶credit授予表空間配額
alter?user?credit?quota?50M?on?creditTab1;
alter?user?credit?quota?50M?on?creditTab2;
alter?user?credit?quota?50M?on?creditTab3;
alter?user?credit?quota?50M?on?creditTab4;
alter?user?credit?quota?50M?on?creditTab5;
alter?user?credit?quota?50M?on?creditTab6;
alter?user?credit?quota?50M?on?creditTab7;
alter?user?credit?quota?50M?on?creditTab8;
alter?user?credit?quota?50M?on?creditTab9;
alter?user?credit?quota?50M?on?creditTab10;
alter?user?credit?quota?50M?on?creditTab11;
alter?user?credit?quota?50M?on?creditTab12;
創建分區,按照consume_date劃分,共12個分區drop?table?credit.credit2018;
create?table?credit.credit2018
(consume_id??number,
card_no??????varchar2(50),
shop?????????varchar2(50),
goods????????varchar2(50),
amount???????number(10,2),
consume_date?date
)
partition?by?range(consume_date)
(
partition?partition1?values?less?than(to_date('2018-02-01','yyyy-mm-dd'))?tablespace?creditTab1,
partition?partition2?values?less?than(to_date('2018-03-01','yyyy-mm-dd'))?tablespace?creditTab2,
partition?partition3?values?less?than(to_date('2018-04-01','yyyy-mm-dd'))?tablespace?creditTab3,
partition?partition4?values?less?than(to_date('2018-05-01','yyyy-mm-dd'))?tablespace?creditTab4,
partition?partition5?values?less?than(to_date('2018-06-01','yyyy-mm-dd'))?tablespace?creditTab5,
partition?partition6?values?less?than(to_date('2018-07-01','yyyy-mm-dd'))?tablespace?creditTab6,
partition?partition7?values?less?than(to_date('2018-08-01','yyyy-mm-dd'))?tablespace?creditTab7,
partition?partition8?values?less?than(to_date('2018-09-01','yyyy-mm-dd'))?tablespace?creditTab8,
partition?partition9?values?less?than(to_date('2018-10-01','yyyy-mm-dd'))?tablespace?creditTab9,
partition?partition10?values?less?than(to_date('2018-11-01','yyyy-mm-dd'))?tablespace?creditTab10,
partition?partition11?values?less?than(to_date('2018-12-01','yyyy-mm-dd'))?tablespace?creditTab11,
partition?partition12?values?less?than(maxvalue)?tablespace?creditTab12
);
例如:插入了2018-01-01的消費記錄則會保存在partition1分區中,大于2018-12-01的記錄會被記錄到partition12分區中。--查看分區表信息
select?*?from?dba_part_tables?t?where?t.owner='CREDIT';
partitioning_type:分區方法——包括range,hash,system,list
subpartitioning_type:組合分區方法——包括none,hash,system,list
partition_count:表中分區的數量
def_subpartition_count:在組合分區中,子分區數量
partitioning_key_count:在組合分區中,子分區中鍵中包含的列數量--查看分區表中分區信息
select?*?from?dba_tab_partitions?t?where?t.table_owner='CREDIT';
composite:是否為組合分區表
subpartition_count:如果為組合分區時,包含的子分區數
high_value:分區上限
high_value_length:分區上限值的長度
partition_position:分區在表中的位置--創建全局范圍分區索引
create?index?credit.idx_sonsume2018
on?credit.credit2018(consume_date)
global?partition?by?range(consume_date)
(
partition?partition1?values?less?than(to_date('2018-02-01','yyyy-mm-dd'))?tablespace?creditTab1,
partition?partition2?values?less?than(to_date('2018-03-01','yyyy-mm-dd'))?tablespace?creditTab2,
partition?partition3?values?less?than(to_date('2018-04-01','yyyy-mm-dd'))?tablespace?creditTab3,
partition?partition4?values?less?than(to_date('2018-05-01','yyyy-mm-dd'))?tablespace?creditTab4,
partition?partition5?values?less?than(to_date('2018-06-01','yyyy-mm-dd'))?tablespace?creditTab5,
partition?partition6?values?less?than(to_date('2018-07-01','yyyy-mm-dd'))?tablespace?creditTab6,
partition?partition7?values?less?than(to_date('2018-08-01','yyyy-mm-dd'))?tablespace?creditTab7,
partition?partition8?values?less?than(to_date('2018-09-01','yyyy-mm-dd'))?tablespace?creditTab8,
partition?partition9?values?less?than(to_date('2018-10-01','yyyy-mm-dd'))?tablespace?creditTab9,
partition?partition10?values?less?than(to_date('2018-11-01','yyyy-mm-dd'))?tablespace?creditTab10,
partition?partition11?values?less?than(to_date('2018-12-01','yyyy-mm-dd'))?tablespace?creditTab11,
partition?partition12?values?less?than(maxvalue)?tablespace?creditTab12
);
--查看分區索引
select?*?from?dba_part_indexes?t?where?t.owner='CREDIT';
--查看分區索引中分區的信息
select?*?from?dba_ind_partitions?t?where?t.index_owner='CREDIT';
locality:區別本地、全局索引--創建本地分區索引
create?index?idx_consume_date?on?credit.credit2018(consume_date)?local;
查看詳細信息同上。
創建散列分區表:有些情況下,用戶只希望對擁有大型數據表進行分區,但并不要求把記錄放置在指定的分區中,此時可以采用散列分區的方式,由系統分區鍵上的值分配到不同的分區中。
日志表:
--創建3個分區
create?tablespace?tabLog1
datafile?'E:\app\Administrator\admin\orcl\logDataFile01.dbf'?size?50M;
create?tablespace?tabLog2
datafile?'E:\app\Administrator\admin\orcl\logDataFile02.dbf'?size?50M;
create?tablespace?tabLog3
datafile?'E:\app\Administrator\admin\orcl\logDataFile03.dbf'?size?50M;
--創建散列分區表
create?table?hashPartitionLog
(
log_id???????number,
log_text?????varchar2(4000),
log_date?????date
)
partition?by?hash(log_id)
(
partition?partition1?tablespace?tabLog1,
partition?partition2?tablespace?tabLog2,
partition?partition3?tablespace?tabLog3
);
查看分區信息同上。--創建全局散列分區索引
create?index?idx_log_id
on?hashPartitionLog(Log_Id)
global?partition?by?hash(log_id)
(
partition?partition1?tablespace?tabLog1,
partition?partition2?tablespace?tabLog2,
partition?partition3?tablespace?tabLog3
);
創建列表分區表:將銷售市場按區域劃分,黑龍江、吉林和遼寧為東北大區part_db,北京、天津、河北為華北大區part_hb等。
--創建4個分區
create?tablespace?tabMarket1
datafile?'E:\app\Administrator\admin\orcl\marketDataFile01.dbf'?size?50M;
create?tablespace?tabMarket2
datafile?'E:\app\Administrator\admin\orcl\marketDataFile02.dbf'?size?50M;
create?tablespace?tabMarket3
datafile?'E:\app\Administrator\admin\orcl\marketDataFile03.dbf'?size?50M;
create?tablespace?tabMarket4
datafile?'E:\app\Administrator\admin\orcl\marketDataFile04.dbf'?size?50M;
--創建列表分區表
create?table?saleMarket
(
area_id??????number,
area_name????varchar2(100),
description??varchar2(4000)
)partition?by?list(area_name)
(
partition?part_db?values('黑龍江','吉林','遼寧')?tablespace?tabMarket1,
partition?part_hb?values('北京','天津','河北')?tablespace?tabMarket2,
partition?part_hn?values('廣東','廣西','海南')?tablespace?tabMarket3,
partition?part_qt?values(default)?tablespace?tabMarket4
);
查看分區信息同上。
創建組合范圍-散列分區表
組合分區就是在分區中再創建子分區。--1.首先為每個散列子分區創建各自的表空間
create?tablespace?hashTab1
datafile?'E:\app\Administrator\admin\orcl\hashDataFile01.dbf'?size?50M;
create?tablespace?hashTab2
datafile?'E:\app\Administrator\admin\orcl\hashDataFile02.dbf'?size?50M;
create?tablespace?hashTab3
datafile?'E:\app\Administrator\admin\orcl\hashDataFile03.dbf'?size?50M;
--2.然后向用戶credit授予表空間配額
alter?user?credit?quota?50M?on?hashTab1;
alter?user?credit?quota?50M?on?hashTab2;
alter?user?credit?quota?50M?on?hashTab3;
--3.創建表consume2018
drop?table?credit.credit2018;
create?table?credit.credit2018
(
consume_id????????number,
card_no???????????varchar2(50),
shop??????????????varchar2(50),
goods?????????????varchar2(50),
amount????????????number(10,2),
consume_date??????date
)
partition?by?range(consume_date)
subpartition?by?hash(consume_id)
subpartitions?3?store?in?(hashTab1,hashTab2,hashTab3)
(
partition?partition1?values?less?than(to_date('2018-02-01','yyyy-mm-dd'))?tablespace?creditTab1,
partition?partition2?values?less?than(to_date('2018-03-01','yyyy-mm-dd'))?tablespace?creditTab2,
partition?partition3?values?less?than(to_date('2018-04-01','yyyy-mm-dd'))?tablespace?creditTab3,
partition?partition4?values?less?than(to_date('2018-05-01','yyyy-mm-dd'))?tablespace?creditTab4,
partition?partition5?values?less?than(to_date('2018-06-01','yyyy-mm-dd'))?tablespace?creditTab5,
partition?partition6?values?less?than(to_date('2018-07-01','yyyy-mm-dd'))?tablespace?creditTab6,
partition?partition7?values?less?than(to_date('2018-08-01','yyyy-mm-dd'))?tablespace?creditTab7,
partition?partition8?values?less?than(to_date('2018-09-01','yyyy-mm-dd'))?tablespace?creditTab8,
partition?partition9?values?less?than(to_date('2018-10-01','yyyy-mm-dd'))?tablespace?creditTab9,
partition?partition10?values?less?than(to_date('2018-11-01','yyyy-mm-dd'))?tablespace?creditTab10,
partition?partition11?values?less?than(to_date('2018-12-01','yyyy-mm-dd'))?tablespace?creditTab11,
partition?partition12?values?less?than(maxvalue)?tablespace?creditTab12
);
查看分區信息同上。查看分區信息時可以看出,分區數量為12,子分區數量為3
還有一種是為所有分區創建相同的子分區。--為所有分區創建相同的子分區
drop?table?credit.credit2018;
create?table?credit.credit2018
(
consume_id????????number,
card_no???????????varchar2(50),
shop??????????????varchar2(50),
goods?????????????varchar2(50),
amount????????????number(10,2),
consume_date??????date
)
partition?by?range(consume_date)
subpartition?by?hash(consume_id)
(
partition?partition1?values?less?than(to_date('2018-02-01','yyyy-mm-dd'))?tablespace?creditTab1,
partition?partition2?values?less?than(to_date('2018-03-01','yyyy-mm-dd'))?tablespace?creditTab2
(
subpartition?sub_part_1?tablespace?hashTab1,
subpartition?sub_part_2?tablespace?hashTab2,
subpartition?sub_part_3?tablespace?hashTab3
),
partition?partition3?values?less?than(to_date('2018-04-01','yyyy-mm-dd'))?tablespace?creditTab3,
partition?partition4?values?less?than(to_date('2018-05-01','yyyy-mm-dd'))?tablespace?creditTab4,
partition?partition5?values?less?than(to_date('2018-06-01','yyyy-mm-dd'))?tablespace?creditTab5,
partition?partition6?values?less?than(to_date('2018-07-01','yyyy-mm-dd'))?tablespace?creditTab6,
partition?partition7?values?less?than(to_date('2018-08-01','yyyy-mm-dd'))?tablespace?creditTab7,
partition?partition8?values?less?than(to_date('2018-09-01','yyyy-mm-dd'))?tablespace?creditTab8,
partition?partition9?values?less?than(to_date('2018-10-01','yyyy-mm-dd'))?tablespace?creditTab9,
partition?partition10?values?less?than(to_date('2018-11-01','yyyy-mm-dd'))?tablespace?creditTab10,
partition?partition11?values?less?than(to_date('2018-12-01','yyyy-mm-dd'))?tablespace?creditTab11,
partition?partition12?values?less?than(maxvalue)?tablespace?creditTab12
);
查看分區信息得知,只有分區partition2中包含了3個子分區,其他分區中都是沒有子分區的。
組合范圍-列表分區--為每個散列子分區創建各自的表空間
create?tablespace?listTab1
datafile?'E:\app\Administrator\admin\orcl\listDataFile01.dbf'?size?50M;
create?tablespace?listTab2
datafile?'E:\app\Administrator\admin\orcl\listDataFile02.dbf'?size?50M;
create?tablespace?listTab3
datafile?'E:\app\Administrator\admin\orcl\listDataFile03.dbf'?size?50M;
create?tablespace?listTab4
datafile?'E:\app\Administrator\admin\orcl\listDataFile04.dbf'?size?50M;
--向用戶credit授予表空間配額
alter?user?credit?quota?50M?on?listTab1;
alter?user?credit?quota?50M?on?listTab2;
alter?user?credit?quota?50M?on?listTab3;
alter?user?credit?quota?50M?on?listTab4;
--創建表
create?table?credit.rangeListPartTable
(
id????????number,
name??????varchar2(4000)
)
partition?by?range(id)
subpartition?by?list(name)
subpartition?template
(
subpartition?part_a?values('a')?tablespace?listTab1,
subpartition?part_b?values('b')?tablespace?listTab2,
subpartition?part_c?values('c')?tablespace?listTab3,
subpartition?part_d?values(default)?tablespace?listTab4
)
(
partition?partition1?values?less?than(100)?tablespace?listTab1,
partition?partition2?values?less?than(200)?tablespace?listTab2,
partition?partition3?values?less?than(300)?tablespace?listTab3,
partition?partition4?values?less?than(maxvalue)?tablespace?listTab4
);
查看分區信息同上。
查詢分區中的記錄--日志表,查詢使用
insert?into?hashpartitionLog?values(1,'logText1',sysdate);
insert?into?hashpartitionLog?values(2,'logText2',sysdate);
insert?into?hashpartitionLog?values(3,'logText3',sysdate);
insert?into?hashpartitionLog?values(4,'logText4',sysdate);
insert?into?hashpartitionLog?values(5,'logText5',sysdate);
insert?into?hashpartitionLog?values(6,'logText6',sysdate);
insert?into?hashpartitionLog?values(7,'logText7',sysdate);
insert?into?hashpartitionLog?values(8,'logText8',sysdate);
insert?into?hashpartitionLog?values(9,'logText9',sysdate);
insert?into?hashpartitionLog?values(10,'logText10',sysdate);
commit;
--查看分區表中的partition1的數據
select?*?from?hashpartitionLog?partition(partition1);
省略:添加、收縮、合并、拆分、階段、重命名、刪除表分區;添加、重新編譯、拆分、重命名、刪除索引分區。