??? create
table
t1_trans
??? ? (
??? ??? trans_id
number
,
??? ??? item
varchar2
(
300
),
??? ??? trans_date
date
,
??? ??? trans_state
varchar2
(
10
)
??? ?? )
???
?
partition
by
range
(trans_id)
??? ? (
??? ???
partition
part_01
values
less
than
(
10000
)
tablespace
wxq_tbs,
??? ???
partition
part_02
values
less
than
(
30000
)
tablespace
users,
??? ???
partition
part_03
values
less
than
(
maxvalue
)
tablespace
system
??? ?? );
?
???
注:必須要從小到達,分類排列。不滿足當前分區條件的,則被放入下一分區。
?
?
??? 2、散列分區(hash)
?
??? 散列分區是根據hash算法均勻分布在各個分區上,格式如下:
?
??? create
table
t1_trans
??? ? (
??? ??? trans_id
number
,
??? ??? item
varchar2
(
300
),
??? ??? trans_date
date
,
??? ??? trans_state
varchar2
(
10
)
??? ?? )
???
?
partition
by
hash
(trans_id)
??? ? (
??? ???
partition
part_01
tablespace
wxq_tbs,
??? ???
partition
part_02
tablespace
users,
??? ???
partition
part_03
tablespace
system
??? ?? );
?
?
??? 3、列表分區(list)
?
??? 列表分區用于對非數值的數據類型分類分區,要列舉出來,值不能太多
?
??? create
table
t1_trans
??? ? (
??? ??? trans_id
number
,
??? ??? item
varchar2
(
300
),
??? ??? trans_date
date
,
??? ??? trans_state
varchar2
(
10
)
??? ?? )
???
?
partition
by
list
(trans_state)
??? ? (
??? ???
partition
part_01
values
(
'
杭州
'
,
'
南京
'
)
tablespace
wxq_tbs,
??? ???
partition
part_02
values
(
'
上海
'
,
'
北京
'
)
tablespace
users,
??????? partition
part_02
values
(
default
)
tablespace
system
??? ?? );
?
???? 4、組合范圍散列分區
?
??? 在根據范圍分區之后,還要對每個分區的數據散列分布在幾個表空間中
?
??? createtable t1_trans
??? ? (
??? ??? trans_id number,
??? ??? item varchar2(300),
??? ??? trans_date date,
??? ??? trans_state varchar2(10)
??? ?? )
??? ? partitionbyrange (trans_date)
??? ? subpartitionbyhash (trans_id)
??? ? subpartitions3storein (wxq_tbs,users,system)
??? ? (
??? ??? partition part_01 valueslessthan(date'2008-01-01'),
??? ??? partition part_02 valueslessthan(date'2009-01-01'),
??? ??? partition part_03 valueslessthan(maxvalue)
??? ?? );
?
??? 注:使用hash是為了使數據分散到各個tablespace,使用range是為了查詢、操作時分開part_01,功能不同!
??
??? 5、組合范圍列表分區
?
??? 先對范圍分區,然后根據列表值再分區,可以交叉tablespace
?
??? createtable t1_trans
??? ? (
??? ??? trans_id number,
??? ??? item varchar2(300),
??? ??? trans_date date,
??? ??? trans_state varchar2(10)
??? ?? )
??? ? partitionbyrange (trans_id)
??? ? subpartitionbylist (trans_state)
??? ? ( partition part_01 valueslessthan(10000)
??? ???? (subpartition part_01_1 values ('杭州','南京') tablespace wxq_tbs,
??? ????? subpartition part_01_2 values (default) tablespace users ),
??? ??? partition part_02 valueslessthan(maxvalue)
??? ???? (subpartition part_02_1 values ('杭州','南京') tablespace wxq_tbs,
??? ????? subpartition part_02_2 values (default) tablespacesystem )
??? ?? );
???? 注:4、5兩種方法簡單了解一下就可以,記住格式。
?
?
??? 6、通過as select建立分區表
?
??? createtable t1_trans_2
??? ?
??? ? partitionbyrange (polno)
??? ? (
??? ??? partition part_01 valueslessthan(210010000000000) tablespace users,
??? ??? partition part_02 valueslessthan(maxvalue) tablespace wxq_tbs
??? ?? )
?
??? ? as
??? select * from lcpol;
???? 注:as語句必須寫在分區的后面。
?
?
分區表的操作
?
??? 對于分區表,可以進行與正常的堆表一樣的所有操作,另外還可以專門針對分區進行操作。
?
??? 1、查找某分區數據
?
??? select * from t1_trans partition(part_01);
?
??? 2、操作某分區數據
?
??? delete t1_trans partition(part_01);
?
??? 注:當數據量很大的時候,指定分區會大大提高效率
?
?
分區表維護
?
??? 1、刪除分區
?
??? altertable t1_trans
??? droppartition part_02;
???? 注:刪除分區會自動刪除分區中的所有數據,而不是交由剩下分區。
?
??? 2、添加分區
?
??? altertable t1_trans
??? addpartition part_02 valueslessthan(20000) tablespace users;
???? 注:添加時不能在兩個范圍內插入分區,必須要大于最后一個分區的最大值。
?
??? 3、合并分區
?
??? altertable t1_trans
??? mergepartitions part_01,part_02 intopartition part_new;
?
??? 注:合并時不能將結果partition命名為小的那個partition名字。
???? 4、分裂分區
?
??? altertable t1_trans
??? splitpartition part_02 at (20000) into (partition part_02,partition part_03);
???? 5、改換分區所屬tablespace
?
??? altertable t1_trans
??? movepartition part_03 tablespace wxq_tbs;
??