1:oracle 分区的最大的好处是容易管理实现了滑动窗口
2:全表扫描时的分区消除(一般是取得行数较多,不适合用索引的时候)
3:分区的并发
然而这几条都不适合OLTP
滑动窗口完整例子
创建分区表
create table t (a number,b number,c number)
partition by range(a)
(
partition p1 values less than(100),
partition p2 values less than(300)
)
向分区1插入数据
begin
for i in 0..99 loop
insert into t values(i,i,i);
end loop;commit;
end;
向分区2插入数据
begin
for i in 100..199 loop
insert into t values(i,i,i);
end loop;commit;
end;
select * from t partition(p1)
select * from t partition(p2)
创建全局索引
create index t_global_idx on t(a) global
创建本地索引
create index t_local_idx on t(b) local
新建表t1
create table t1 (a number,b number,c number)
create index t1_idx on t1(b)
select * from t1
新建表t2
create table t2 (a number,b number,c number)
create index t2_idx on t2(b)
begin
for i in 200..299 loop
insert into t2 values(i,i,i);
end loop;commit;
end;
select * from t2
分区p1和表t1中的数据交换
alter table t exchange partition p1
with table t1
including indexes
without validation
select * from t1
select * from t partition(p1)
分区p2和表t2中的数据交换
alter table t exchange partition p2
with table t2
including indexes
without validation
select * from t2
select * from t partition(p2)
查看最后的分区表t
select * from t
由于分区的交换会导致全局索引的失效所以需要重建
没有重建索引
select * from t where a=200
SELECT STATEMENT
PARTITION RANGE SINGLE
TABLE ACCESS FULL
重建索引
alter index t_global_idx rebuild
select * from t where a=200
SELECT STATEMENT
TABLE ACCESS BY GLOBAL INDEX ROWID
INDEX RANGE SCAN
或者指定分区交换的时候自动更新全局索引,只要在交换分区语句后加上红色部分就可以了。
alter table t exchange partition p1
with table t1
including indexes
without validation
update global indexes
这种方法由于是在交换的过程中自动更新索引,
相比手动重建索引消耗资源更多,但是这种方式可以提供持续的有效性,
对用户的影响比较小。牺牲性能换取持续的有效性。
手动重建索引,如果表中数据较多,则会有很长一段时间可用性非常低。对用户影响较大