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分区中。

4

1 回答 1

3

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

MAY其次,假设和分区之间没有分区,则DEF可以拆分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分区。

于 2012-04-19T20:04:45.133 回答