ALTER TABLE quarterly_regional_sales
? ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY'))
? ? ? STORAGE (INITIAL 20K NEXT 20K) TABLESPACE ts3 NOLOGGING
? ? ? ? (
? ? ? ? ? SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'),
? ? ? ? ? SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'),
? ? ? ? ? SUBPARTITION q1_2000_northeast VALUES ('NY', 'VM', 'NJ'),
? ? ? ? ? SUBPARTITION q1_2000_southeast VALUES ('FL', 'GA'),
? ? ? ? ? SUBPARTITION q1_2000_northcentral VALUES ('SD', 'WI'),
? ? ? ? ? SUBPARTITION q1_2000_southcentral VALUES ('OK', 'TX')
? ? ? ? );
添加一个子分区
你可以在ALTER TABLE语句中使用MODIFY PARTITION ... ADD SUBPARTITION子句来向一个【范围|列表|间隔】-列表复合分区表添加一个列表子分区。对于一个间隔-列表分区表,你只能向范围分区或者已经物化的间隔分区添加子分区。
在下面的示例中,向范围-列表分区表quarterly_regional_sales的子分区集合中新增一个子分区,新增子分区存储在ts2表空间。
ALTER TABLE quarterly_regional_sales
? MODIFY PARTITION q1_1999
? ? ? ADD SUBPARTITION q1_1999_south
? ? ? ? VALUES ('AR','MS','AL') tablespace ts2;
向范围复合分区表添加分区
可以在分区和列表子分区两个级别来添加分区。
添加一个分区
向一个【范围|列表|间隔】-范围复合分区表添加一个分区如前所述。对于一个间隔-哈希分区表,间隔分区是自动创建的。你可以通过SUBPARTITION子句来给子分区命名和提供值列表。如果没有指定SUBPARTITION子句,那么子分区将继??子分区模板。如果没有子分区模板,那么将会创建一个单独的子分区,其最大值为MAXVALUE。
如例子4-29所示,向范围-范围分区表shipments增加一个新的范围分区p_2007_jan,新的分区将用来存储2007年1月份的数据。在这个例子中,新增分区包含3个子分区,子分区会继承分区级别的压缩属性并以压缩形式存储。
例4-29 向范围-范围分区表添加分区
ALTER TABLE shipments
? ADD PARTITION p_2007_jan
? ? ? VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy')) COMPRESS
? ? ? ( SUBPARTITION p07_jan_e VALUES LESS THAN (TO_DATE('15-FEB-2007','dd-MON-yyyy'))
? ? ? , SUBPARTITION p07_jan_a VALUES LESS THAN (TO_DATE('01-MAR-2007','dd-MON-yyyy'))
? ? ? , SUBPARTITION p07_jan_l VALUES LESS THAN (TO_DATE('01-APR-2007','dd-MON-yyyy'))
? ? ? ) ;
添加一个子分区
你可以在ALTER TABLE语句中使用MODIFY PARTITION ... ADD SUBPARTITION子句来向一个【范围|列表|间隔】-范围复合分区表添加一个范围子分区。对于一个间隔-范围分区表,你只能向范围分区或者已经物化的间隔分区添加子分区。
下面的示例中,向shipments表添加一个新的范围分区,包含所有order_date字段值在2007年1月份并且delivery_date字段值大于等于2007年4月1日的数据。
ALTER TABLE shipments
? MODIFY PARTITION p_2007_jan
? ? ? ADD SUBPARTITION p07_jan_vl VALUES LESS THAN (MAXVALUE) ;
向引用分区添加一个分区或子分区
就像分区和子分区可以被添加到范围分区表、哈希分区表、列表分区表或者符合分区表一样,我们可以在引用分区的定义中向父表添加分区或者子分区。添加操作自动级联到所有引用分区表中。当你向主表添加分区或者子分区时,你可以通过DEPENDENT TABLES子句来为相关表设置属性。
添加索引分区
你不能显式地给本地索引添加分区,相反,只有当你向基表中添加一个分区时,一个新的分区也会添加到本地索引中。具体来说,当你发出ALTER TABLE语句来向一个包含本地索引的表添加分区时,一个匹配的分区也会同时添加到本地索引中。数据库会给新的索引分区指定名称和默认物理存储属性,但是,在ADD PARTITION操作完成后你也可以对其重命名。
你可以在ADD PARTITION操作中,通过首先修改索引的默认属性来给索引分区指定一个新的表空间。例如,设想有一个本地索引q1_sales_by_region_locix,隶属于列表分区表q1_sales_by_region。如果,在新增分区q1_nonmainland之前,如上文中“向列表分区表中添加分区”所示,你可以执行以下语句,那么相关的索引分区将会被创建在tbs_4表空间中。
ALTER INDEX q1_sales_by_region_locix
? MODIFY DEFAULT ATTRIBUTES TABLESPACE tbs_4;
?
否则,在添加分区后,你必须使用以下语句将索引分区移动到tbs_4表空间。
ALTER INDEX q1_sales_by_region_locix
? REBUILD PARTITION q1_nonmainland TABLESPACE tbs_4;
可以使用ALTER INDEX…ADD PARTITION语句来向全局哈希分区索引添加一个分区。数据库将会添加新的哈希分区,并且对索引的一个现存子分区的所有条目根据哈希函数重新进行哈希排列,并将其中的部分数据填充到新增分区索引中。下面的语句向索引hgidx添加分区索引p5。
ALTER INDEX hgidx ADD PARTITION p5;
?
你不能向全局范围分区索引添加分区,因为最高分区的边界值通常为MAXVALUE。为了添加一个新的最高分区,使用ALTER INDEX ... SPLIT PARTITION语句。