2012-04-19 56 views
1

我有一个带分区的大表。 例如:更改表分区的范围值

CREATE TABLE cust_order (
cust_id  NUMBER(10), 
start_date VARCHAR2(25), 
amount_sold NUMBER(10,2)) 
PARTITION BY RANGE (START_DATE) 
( 
PARTITION MAY VALUES LESS THAN ('20120601'), 
PARTITION DEF VALUES LESS THAN(MAXVALUE)); 

我想改变表,以便MAY分区包含的值小于“20120501”,并从“20120501”到“20120601”的数据被存储在DEF分区。

回答

3

首先,您应该始终将日期存储在DATE列中。将日期存储在VARCHAR2(25)列中是出现问题的秘诀 - 某人将不可避免地插入具有意外格式的字符串。

其次,假设有在MAYDEF分区之间没有分区,你可能分裂MAY分区

ALTER TABLE cust_order 
    SPLIT PARTITION may AT ('20120501') 
    INTO(PARTITION may, 
     PARTITION june_temp) 
UPDATE GLOBAL INDEXES; 

然后合并JUNE_TEMPDEF分区

ALTER TABLE cust_order 
    MERGE PARTITIONS june_temp, def 
    INTO PARTITION def 

我不确定我是否看到智慧,但是,这样做......默认分区通常不应该存储任何数据 - 通常只有这样才能使插入不会出错如果他们有意想不到的大分区键。因此,将已经存在于一个分区中的数据转移到默认分区中似乎很奇怪。如果你将来要创建一个JUNE分区,我不确定为什么你不会将分区分割成MAYJUNE分区。

+0

你好,贾斯汀,对1)是这样实现的。我想“拆分”MAY分区,以便将小于20120501的值传递给MAY,并将不再适合该分区的值转至DEF。 – odew 2012-04-19 20:09:52

+0

@odew - 更新了你的问题和我的答案。 – 2012-04-19 20:35:30