目的:算法
場景:sql
分類:安全
在以上分區的基礎上,能夠兩兩結合,造成 複合分區,但經常使用的就是兩種:oracle
範圍分區:less
-- 建立一個普通表的語句
create table person1 (id int primary key, name varchar2(20), birth date); -- 數據將會在同一個表空間同一個段內 insert into person1 values (1, 'sss', sysdate); -- 建立一個分區表 -- 這裏是按照生日進行範圍分區 -- 語句的基本格式就是在普通建表的語句上,增長 partition by 語句塊 create table person2 (name varchar2(20), birth date) partition by range (birth) ( partition p1 values less than (to_date('19950101','yyyymmdd')), -- 'values less than' partition p2 values less than (to_date('20000101','yyyymmdd')), partition p3 values less than (maxvalue) -- 默認分區 ); -- 插入,數據會根據分區的狀況進入不一樣的分區內 insert into person2 values ('張三', to_date('19940707')); insert into person2 values ('李四', to_date('19980707')); insert into person2 values ('王五', to_date('20040707')); -- 查詢表中全部數據 select * from person2; -- 查詢特定分區上數據 select * from person2 partition (p3); -- 能夠爲不一樣的分區指定不一樣的表空間 -- 沒有指定表空間的分區,使用用戶的默認表空間 -- 因此,一個表內的數據能夠存在於不一樣表空間裏,也就是能夠存放在不一樣數據文件中,不一樣磁盤上 -- 所以,分區表能加強數據的安全性 create table person3 (name varchar2(20), birth date) partition by range (birth) ( partition p1 values less than (to_date('19950101','yyyymmdd')) tablespace system, partition p2 values less than (to_date('20000101','yyyymmdd')) tablespace sysaux, partition p3 values less than (maxvalue) tablespace users ); -- 能夠在其餘類型上進行範圍分區 -- 也能夠在多個字段上進行範圍分區 create table person4 (name varchar2(20), birth date, score number) partition by range (birth, score) ( partition p1 values less than (to_date('19900101','yyyymmdd'), 60), partition p2 values less than (to_date('19900101','yyyymmdd'), 90), partition p3 values less than (to_date('19990101','yyyymmdd'), 60), partition p4 values less than (to_date('19990101','yyyymmdd'), 90), partition p5 values less than (maxvalue, maxvalue) );
列表分區:spa
-- 若是是生日的這樣的字段,數據是連續的,應該使用分爲分區
create table person (name varchar2(20), birth date) partition by range(birth) ( partition p1 values less than (to_date('19900101', 'yyyymmdd')) tablespace users, partition p2 values less than (maxvalue) ); insert into person values ('aaa', to_date('19871212', 'yyyymmdd')); select * from person partition (p1); /* where birth between 1987 and 1990 where sex in ('男', '女') */ -- 可是像性別、民族等字段,更適合使用的是列表分區 -- 下面一個例子,使用性別做爲分區字段,男的一個區,女的一個區 create table person2 (name varchar2(20), sex varchar(10)) partition by list (sex) ( partition p1 values ('男'), partition p2 values ('女') ); insert into person2 values ('aaa', '男'); insert into person2 values ('bbb', '女'); insert into person2 values ('ccc', '未知'); -- 報錯 select * from person2 partition (p2); -- 默認分區的寫法 create table person3 (name varchar2(20), sex varchar(10)) partition by list (sex) ( partition p1 values ('男'), partition p2 values ('女'), partition p3 values (default) ); insert into person3 values ('ccc', '未知'); select * from person3 partition (p3); -- 能夠爲每一個分區指定表空間 create table person3 (name varchar2(20), sex varchar(10)) partition by list (sex) ( partition p1 values ('男') tablespace users, partition p2 values ('女') tablespace system, partition p3 values (default) );
哈希分區:string
-- 哈希分區
-- 主要用在一些比較離散,很差分類的數據上,好比產品名字 -- 讓 oracle 使用哈希算法自動計算數據的分區 -- 建立語句,很是簡單 create table person4 (name varchar2(20), sex varchar2(10)) partition by hash (name) ( partition p1, partition p2 tablespace users ); insert into person4 values ('aaa', '男'); insert into person4 values ('收款', '男'); select * from person4 partition (p1); -- 上面的語句能夠進一步簡化爲: create table person5 (name varchar2(20), sex varchar2(10)) partition by hash (name) partitions 5; -- 爲每一個分區指定表空間 create table person6 (name varchar2(20), sex varchar2(10)) partition by hash (name) partitions 3 store in (users, system, sysaux);
範圍-列表分區:產品
-- 首先,按照生日進行列表分區,分了三個區
-- 其次,在每一個分區內,又按照性別分了三個區 -- 因此,總共是 3 個分區 9 個子分區 create table person8 (name varchar2(20), sex varchar2(10), birth date) partition by range(birth) subpartition by list(sex) subpartition template ( subpartition sp01 values ('男'), subpartition sp02 values ('女'), subpartition sp03 values (default) ) ( partition p1 values less than (to_date('19900101', 'yyyymmdd')), partition p2 values less than (to_date('20000101', 'yyyymmdd')), partition p3 values less than (maxvalue) ); insert into person8 values ('aaa', '男', to_date('19900202')); -- 查詢這條數據,有如下三種方式: select * from person8; select * from person8 partition (p1); select * from person8 subpartition (p1_sp01);
範圍-哈希分區:hash
-- 先按照生日,將數據分爲三個區
-- 而後在每一個分區內,又按照哈希算法分紅了三個區 -- 這樣就保證了每一個分區內的數據儘可能的少,並且分區進行平衡 create table person7 (name varchar2(20), birth date) partition by range (birth) subpartition by hash (name) subpartitions 3 ( partition p1 values less than (to_date('19900101', 'yyyymmdd')), partition p2 values less than (to_date('20000101', 'yyyymmdd')), partition p3 values less than (maxvalue) );
相關字典表:it
select * from user_objects where object_name ='PERSON8'; select * from user_tables where table_name = 'PERSON8'; select * from user_tab_partitions where table_name = 'PERSON8'; select * from user_tab_subpartitions where table_name = 'PERSON8';
操做表分區:
-- 添加分區
alter table person add partition p9 values less than (MAXVALUE); alter table person add partition p9 values (1, 2); -- 針對 list 分區 alter table person add partition; -- 針對 hash 分區 -- 刪除分區 alter table person drop partition p3; -- 刪除分區內數據 alter table person truncate partition p3; -- 合併相鄰分區 alter table person merge partitions p2, p3 into partition p8; -- 拆分分區 alter table person split partition p2 at (3000) into (partition p3, partition p14); -- 範圍分區的拆分 alter table person split partition p2 values (1,2) into (partition p3, partition p4); -- 列表分區的拆分 alter table person split partition p2 into (partition p3 values (1, 2), partition p4 values (3), partition p5); -- 列表分區的拆分 -- 重命名分區 alter table person rename partition p2 to p12;