2012-04-19 79 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