Oracle数据库分区解决方案
数据库分区解决方案
一、建立分区的语法如下:
CREATE TABLE table_name
(……)
PARTITION BY RANGE (column_list)
(
PARTITION partition_name VALUES LESS THAN(values_list) TABLESPACE tablespace_name ,
……
)
table_name:表名称;
column_list:分区关键字(表中的字段)列表;
partition_name:分区名称;
values_list:与column_list相对应,为分区的上限值;
二、分区维护
a) 扩充分区
A、建立分区表空间:
(例CREATE TABLESPACE BCMSPHIS_0603
DATAFILE 'F:\Oracle\BCMSPHIS_0603.DBF' SIZE 1024K AUTOEXTEND ON NEXT 102400K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
B、建立分区:
(例)ALTER TABLE BCPOnInPDataHisRecSht ADD PARTITION BCPINPPART_0603 VALUES LESS THAN(TO_DATE('2006-10-01','YYYY-MM-DD'))
TABLESPACE BCPINPHIS_0603;
C、修改分区索引表空间指向:
(例)ALTER INDEX XIE1BCPOnInPDataHisRecSht REBUILD PARTITION BCPINPPART_0603
TABLESPACE BCPINPHIS_0603;
ALTER INDEX XIE2BCPOnInPDataHisRecSht REBUILD PARTITION BCPINPPART_0603
TABLESPACE BCPINPHIS_0603;
说明:当然扩充新的分区过程中也可以不创建新的表空间,而使用原来已创建的表空间;创建新的分区表的上限值必须大于已有分区的最大上限值,否则无法创建新的分区表;在给表成功添加分区的同时,如果该表定义了局部索引时,也将为每个局部索引自动创建新的分区,分区索引名称与新创建的分区表名称相同,但分区索引的表空间指向索引的表空间,因此,如果要将分区表和分区索引放在同一表空间下的话就需要修改分区索引的表空间;不可以明确向局部索引中增加分区,只能在向表中增加分区时自动向局部索引中增加新的分区;
执行方式如下:(说明:在执行该SQL前如果您已链接着数据库,请断开数据库重新链接;)
b) 分区数据备份
c) 分区删除
分区删除语法:ALTER TABLE DROP PARTITION partition_name
例:ALTER TABLE DROP PARTITION bctinppart_0502
该方式删除表分区和其中的数据,同时该表上局部索引的对应分区也被删除(即使用该索引分区被标记为不可用,它们也被删除);不能明确从局部索引中删除分区,只是在从表中删除分区时删除局部索引分区;倘若要删除一个表分区,但保留其数据,则必须将该分区合并到邻近的分区中。
d) 分区数据恢复
恢复某一个分区的数据:
恢复分区数据时,所恢复分区必须存在,如果恢复分区不存在则必须重新创建该分区,否则恢复数据失败;当创建的恢复分区的上限值大于当前分区最大上限值只,直接创建恢复分区然后修改分区索引的表空间即可;当创建的恢复分区上限值小于当前分区最大上限值时,只能进行分区的分割以创建恢复分区;
e) 分割分区
使用ALTER TABLE 语句的 SPLIT PARTITION子名可以将一个分区分割成两个分区。新分区从旧分区继承属性;旧分区相关的段将被丢弃;该语句也分割该表上每个局部索引中对应的分区(即使它们被标记为不可用);
除了TABLESPACE属性外,旧局部索引分区的物理属性被用于新的索引分区;
例:
--分割分区
alter table bctoninpdatahisrecsht split partition bctinppart _0702
at(to_date('2007-05-01','YYYY-MM-DD'))
into(partition bctinppart_070201 tablespace bctinppart_070201,partition bctinppart_070202);
--修改分区索引表空间
ALTER INDEX XIE1 bctoninpdatahisrecsht REBUILD PARTITION bctinppart _070201
TABLESPACE bctinppart _070201;
ALTER INDEX XIE2 bctoninpdatahisrecsht REBUILD PARTITION bctinppart _070202
TABLESPACE bctinppart _070202;
三、其它:
如果记录的信息超过了分区的上限值则Oracle报错(ORA-14400:插入的分区关键字未映射到任何分区'))
局部索引和全局索引
局部索引:用LOCAL为各个分区创建独立的索引,由于每个分区都有自己独立的索引,所以分区索引对于表来说是局部的;
全局索引:全局索引包含多个分区的值;索引的值跨越多个分区;当在分区里有许多事务发生或需要确保所有分区数据值的唯一性时,通常使用全局索引
局部索引也确保唯一性,但是全局索引执行唯一性检查更快。