1.范围分区
首先建立表空间
create
tablespace
ss1
datafile
'E:\app\suibian\oradata\orcl\ss1.dbf'
size
10
M;
create
tablespace
ss2
datafile
'E:\app\suibian\oradata\orcl\ss2.dbf'
size
10
M;
create
tablespace
ss3
datafile
'E:\app\suibian\oradata\orcl\ss3.dbf'
size
10
M;
/*表和表分区一定要一起建立,不能分开,否则出错*/
create table t1(id number)
partition by range(id)
(
partition p1 values less than(10)
tablespace
ss1,
partition p2 values less than(100)
tablespace
ss2,
partition pm values less than(maxvalue)
tablespace
ss3
);
/*这个是实现插入数据的*/
insert into t1
select 5 from dual union
select 55 from dual union
select 555 from dual;
/*这个是查看各个表的分区信息的*/
select * from user_tab_partitions;
/*查询的实现*/
select * from t partition(p1);
/*这个查询的是p1这一级的数据,如果里面有俩个小于10的数字,那么会打印出俩个数字*/
select * from t partition(p2);
/*相当于分级,不同的阶层有不同的表示方法*/
select * from t partition(pm)
删除,修改等操作
alter
table
t1
drop
partition
pm; /*在等级为pm下的数据全部丢失,慎用*/
/*这样的操作是不会影响其余分区的数据,很稳定。*/
alter table t1 add partition
p2 values less than(1000)
tablespace
ss2
;
/*这样再添加的话只能大于最后一个分区的
分区界限必须调整为高于最后一个分区界限
*/
range:范围划分
partiton by:用于指定的划分区方式。
values less than :指定分区的上界(上限)
那么来段字符串怎么样?
create
table
c1(address
varchar2
(
50
))
partition
by
list
(address)
(
partition
s1
values
(
'阿尔卑斯'
,
'西藏'
,
'桂林'
),
partition
s2
values
(
'马来西亚'
,
'张家界'
,
'好望角'
),
partition
s3
values
(
'三亚'
,
'上海'
,
'墨西哥'
)
);
insert into c1
select '
西藏
' from dual union
select '
张家界
' from dual union
select '
上海
' from dual;
/*与上面雷同*/
select * from c1 partition(s2);
hash分区:事先不知道数据的多少,范围大小很难确定,很难平衡,不希望数据聚集。
create table h1(name varchar2(20))
partition by hash(name)
(
partition l1 tablespace ts1,
partition l2 tablespace ts2,
partition l3 tablespace ts3
);
insert into h1
select 'eafas' from dual union
select 'edddd' from dual union
select 'e3333333333s' from dual union
select 'aaaaaaaaas' from dual;
结果显示无逻辑。。。。
还有一种更加麻烦的分区方法,那就是合成分区,组合分区(composite partitioning)
使用range分区,在每个子分区再使用hash分区实现再分区。
比range更容易管理,支持历史数据和条块数据倆者。
create
table
cp(
id
number
,
address
varchar2
(
50
)
)
partition
by
range
(
id
)
subpartition
by
list
(address)
(
partition
w1
values
less
than
(
100
)
(
subpartition
n11
values
(
'邓肯'
),
subpartition
n12
values
(
'科比'
)
),
partition
w2
values
less
than
(
400
)
(
subpartition
n21
values
(
'詹姆斯'
),
subpartition
n22
values
(
'安东尼'
)
),
partition
w3
values
less
than
(
700
)
(
subpartition
n31
values
(
'邓肯'
),
subpartition
n32
values
(
'科比'
)
),
partition
w4
values
less
than
(
800
)
(
subpartition
n41
values
(
'詹姆斯'
),
subpartition
n42
values
(
'安东尼'
)
)
);
删除操作:alter table cp drop subpartition n11;
查看一个表是不是分区表;
select table_name,partitioned from user_tables;
查看
select * from DBA_TAB_PARTITIONS;
select * from DBA_TAB_SUBPARTITIONS;
select * from DBA_IND_SUBPARTITIONS;
select * from DBA_IND_SUBPARTITIONS;
alter table t add partition r3 values less than(maxvalue);
alter table t split partition r3 at(100000) into (partition r4,partition r5);
alter table t merge partition r4,r5 into partition r3;
alter table t drop partition r3;