您当前的位置:首页 > oracle

Oracle 11g维护分区(一)——Adding Partitions

添加分区0Bblinux系统宝典

本节将介绍如何手动添加新的分区到分区表,并解释了为什么分区不能被指定添加到大部分分区索引。0Bblinux系统宝典

向范围分区表添加一个分区0Bblinux系统宝典

使用ALTER TABLE ... ADD PARTITION语句来添加一个新的分区到“高”端(表中最后一个分区的’HighValue’)。要在开始或在表的中间添加一个分区,使用SPLIT PARTITION子句。0Bblinux系统宝典

例如,考虑这么一张表,sales,除了包含当前月份的数据,还包含之前12个月份的数据。 1999年1月1日,你增加一个分区月份,存储在表空间TSX。0Bblinux系统宝典

ALTER TABLE sales0Bblinux系统宝典

      ADD PARTITION jan99 VALUES LESS THAN ( '01-FEB-1999' )0Bblinux系统宝典

      TABLESPACE tsx;0Bblinux系统宝典

另外,和范围分区表相关的本地索引和全局索引仍然可用。0Bblinux系统宝典

向哈希分区表添加一个分区0Bblinux系统宝典

当你向一个哈希分区表添加分区时,数据库会对一个现有分区(由数据库选择)的所有数据行按照哈希函数进行重新排列,并将数据填充到新增的分区中。因此,如果表非空的话,添加一个哈希分区可能比较费时。0Bblinux系统宝典

下面的语句显示了向scubagear表添加一个哈希分区的两种方式。选择第一条语句来添加哈希分区,分区名称由系统自动生成,并且分区存放在默认表空间。第二条语句同样也是增加一个分区,但是,明确指定了分区名称p_named和表空间名称gear5。0Bblinux系统宝典

ALTER TABLE scubagear ADD PARTITION;0Bblinux系统宝典

ALTER TABLE scubagear0Bblinux系统宝典

      ADD PARTITION p_named TABLESPACE gear5;0Bblinux系统宝典

索引可能被标识为UNUSABLE,如下表所述:0Bblinux系统宝典

表类型0Bblinux系统宝典

索引操作0Bblinux系统宝典

普通表(堆表)0Bblinux系统宝典

除非你在ALTER TABLE语句中指定UPDATE INDEXES字句:0Bblinux系统宝典

对于新增分区和重新分配的现有分区的本地索引,被标识为UNUSABLE,必须重建。0Bblinux系统宝典

所有全局索引,或者分区全局索引的所有分区,被标识为UNUSABLE,必须重建。0Bblinux系统宝典

索引组织表0Bblinux系统宝典

对于本地索引,和普通表的处理方式一样。0Bblinux系统宝典

所有全局索引保持可用;0Bblinux系统宝典

向列表分区表添加一个分区0Bblinux系统宝典

下面的语句说明了如何向列表分区表添加一个新的分区,在示例中,指定了新增分区的存储属性和NOLOGGING属性。0Bblinux系统宝典

ALTER TABLE q1_sales_by_region0Bblinux系统宝典

  ADD PARTITION q1_nonmainland VALUES ('HI', 'PR')0Bblinux系统宝典

      STORAGE (INITIAL 20K NEXT 20K) TABLESPACE tbs_30Bblinux系统宝典

      NOLOGGING;0Bblinux系统宝典

描述新增分区的集合内的所有值不能存在于表的其他分区。0Bblinux系统宝典

如果一个列表分区表包含默认分区,那么你不能给它添加新的分区,但是你可以拆分默认分区。通过这样做,你不仅有效地创建了一个你指定值的新分区,并且第二个分区保留为默认分区。0Bblinux系统宝典

与列表分区表相关的本地和全局索引均保持可用。0Bblinux系统宝典

向间隔分区表添加一个分区0Bblinux系统宝典

你不能显式地向间隔分区表中添加一个分区,除非你西安锁定分区,这将触发创建分区。当该间隔的数据被插入时,数据库会自动创建一个间隔分区。一般情况下,只有在分区交换负载场景中,你才必须显式创建间隔分区。0Bblinux系统宝典

要改变将来分区的间隔,我们可以在ALTER TABLE中使用SET INTERVAL子句。该子句将会改变超过当前最高边界的所有物化间隔分区的间隔。0Bblinux系统宝典

你也可以使用SET INTERVAL子句来迁移一个存在的范围分区表或者符合范围分区表到间隔分区表或复合间隔分区表。如果要禁止创建新的分区,有效的恢复回一个范围分区表,在SET INTERVAL子句中指定一个空值即可。已创建的间隔分区将被转化为范围分区,对应的HighValue为当前最大值。0Bblinux系统宝典

如果要提高日期的间隔范围,你必须确保你在新分区的相应边界。例如,在你的日常间隔分区表transactions的最高间隔分区边界是January 30, 2007,你想把间隔修改为一个月,那么下面的语句将会导致一个错误:0Bblinux系统宝典

ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');0Bblinux系统宝典

ORA-14767: Cannot specify this interval with existing high bounds0Bblinux系统宝典

你必须创建另外一个以February 1, 2007为边界的日常间隔分区,这样才能成功修改间隔。0Bblinux系统宝典

LOCK TABLE transactions PARTITION FOR(TO_DATE('31-JAN-2007','dd-MON-yyyy') IN SHARE MODE;0Bblinux系统宝典

ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');0Bblinux系统宝典

间隔分区表的第一个分区其实是一个范围分区,你可以拆分范围分区,在间隔分区表中添加更多的分区。0Bblinux系统宝典

如果要禁用transactions表的间隔分区,使用以下语句:0Bblinux系统宝典

ALTER TABLE transactions SET INTERVAL ();0Bblinux系统宝典

向哈希复合分区表添加分区0Bblinux系统宝典

可以在分区和哈希子分区两个级别来添加分区。0Bblinux系统宝典

添加一个分区0Bblinux系统宝典

向一个【范围|列表|间隔】-哈希复合分区表添加一个分区如前所述。对于一个间隔-哈希分区表,间隔分区是自动创建的。你可以指定SUBPARTITIONS子句来指定子分区的数量,或者指定SUBPARTITION子句来命名具体子分区。如果没有指定SUBPARTITIONS子句或者SUBPARTITION子句,那么分区将继承表级别的默认属性。对于一个间隔-哈希分区表,你只能向范围或者已经物化的间隔分区添加子分区。0Bblinux系统宝典

这个例子向一个范围-哈希分区表sales添加了一个范围分区q1_2000,该分区用来存储2000年第一季度的数据。其中,有8个子分区存储在tbs5表空间。子分区不能显式使用表压缩。在这个例子中,子分区会继承分区级别的压缩属性并以压缩形式存储。0Bblinux系统宝典

ALTER TABLE sales ADD PARTITION q1_20000Bblinux系统宝典

      VALUES LESS THAN (2000, 04, 01) COMPRESS0Bblinux系统宝典

      SUBPARTITIONS 8 STORE IN tbs5;0Bblinux系统宝典

添加一个子分区0Bblinux系统宝典

你可以在ALTER TABLE语句中使用MODIFY PARTITION ... ADD SUBPARTITION子句来向一个【范围|列表|间隔】-哈希复合分区表添加一个哈希子分区。数据库将会根据哈希函数,对同一分区内的一个已有子分区的所有数据行重新进行哈希排列,并将其中部分数据填充到新增子分区中。对于一个间隔-哈希分区表,你只能向范围分区或者已经物化的间隔分区添加子分区。0Bblinux系统宝典

在下面的示例中,一个存储在us1表空间的新哈希子分区us_loc5, 被添加到diving表的范围分区locations_us中。0Bblinux系统宝典

ALTER TABLE diving MODIFY PARTITION locations_us0Bblinux系统宝典

      ADD SUBPARTITION us_locs5 TABLESPACE us1;0Bblinux系统宝典

除非你指定了UPDATE INDEXES子句,否则,必须重建和新增子分区以及重新进行哈希排列子分区相关的索引子分区。0Bblinux系统宝典

向列表复合分区表添加分区0Bblinux系统宝典

可以在分区和列表子分区两个级别来添加分区。0Bblinux系统宝典

添加一个分区0Bblinux系统宝典

向一个【范围|列表|间隔】-列表复合分区表添加一个分区如前所述。对于一个间隔-哈希分区表,间隔分区是自动创建的。你可以通过SUBPARTITION子句来给子分区命名和提供值列表。如果没有指定SUBPARTITION子句,那么子分区将继承子分区模板。如果没有子分区模板,那么将会创建一个单独的默认子分区。0Bblinux系统宝典

如例子4-28所示,向范围-列表分区表quarterly_regional_sales增加一个新的分区,并且指定了一些新的物理属性,对于没有指定的其他属性则继承表的默认属性。0Bblinux系统宝典

例4-28 向范围-列表分区表添加分区0Bblinux系统宝典

ALTER TABLE quarterly_regional_sales0Bblinux系统宝典

  ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY'))0Bblinux系统宝典

      STORAGE (INITIAL 20K NEXT 20K) TABLESPACE ts3 NOLOGGING0Bblinux系统宝典

        (0Bblinux系统宝典

          SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'),0Bblinux系统宝典

          SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'),0Bblinux系统宝典

          SUBPARTITION q1_2000_northeast VALUES ('NY', 'VM', 'NJ'),0Bblinux系统宝典

          SUBPARTITION q1_2000_southeast VALUES ('FL', 'GA'),0Bblinux系统宝典

          SUBPARTITION q1_2000_northcentral VALUES ('SD', 'WI'),0Bblinux系统宝典

          SUBPARTITION q1_2000_southcentral VALUES ('OK', 'TX')0Bblinux系统宝典

        );0Bblinux系统宝典

添加一个子分区0Bblinux系统宝典

你可以在ALTER TABLE语句中使用MODIFY PARTITION ... ADD SUBPARTITION子句来向一个【范围|列表|间隔】-列表复合分区表添加一个列表子分区。对于一个间隔-列表分区表,你只能向范围分区或者已经物化的间隔分区添加子分区。0Bblinux系统宝典

在下面的示例中,向范围-列表分区表quarterly_regional_sales的子分区集合中新增一个子分区,新增子分区存储在ts2表空间。0Bblinux系统宝典

ALTER TABLE quarterly_regional_sales0Bblinux系统宝典

  MODIFY PARTITION q1_19990Bblinux系统宝典

      ADD SUBPARTITION q1_1999_south0Bblinux系统宝典

        VALUES ('AR','MS','AL') tablespace ts2;0Bblinux系统宝典

向范围复合分区表添加分区0Bblinux系统宝典

可以在分区和列表子分区两个级别来添加分区。0Bblinux系统宝典

添加一个分区0Bblinux系统宝典

向一个【范围|列表|间隔】-范围复合分区表添加一个分区如前所述。对于一个间隔-哈希分区表,间隔分区是自动创建的。你可以通过SUBPARTITION子句来给子分区命名和提供值列表。如果没有指定SUBPARTITION子句,那么子分区将继��子分区模板。如果没有子分区模板,那么将会创建一个单独的子分区,其最大值为MAXVALUE。0Bblinux系统宝典

如例子4-29所示,向范围-范围分区表shipments增加一个新的范围分区p_2007_jan,新的分区将用来存储2007年1月份的数据。在这个例子中,新增分区包含3个子分区,子分区会继承分区级别的压缩属性并以压缩形式存储。0Bblinux系统宝典

例4-29 向范围-范围分区表添加分区0Bblinux系统宝典

ALTER TABLE shipments0Bblinux系统宝典

  ADD PARTITION p_2007_jan0Bblinux系统宝典

      VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy')) COMPRESS0Bblinux系统宝典

      ( SUBPARTITION p07_jan_e VALUES LESS THAN (TO_DATE('15-FEB-2007','dd-MON-yyyy'))0Bblinux系统宝典

      , SUBPARTITION p07_jan_a VALUES LESS THAN (TO_DATE('01-MAR-2007','dd-MON-yyyy'))0Bblinux系统宝典

      , SUBPARTITION p07_jan_l VALUES LESS THAN (TO_DATE('01-APR-2007','dd-MON-yyyy'))0Bblinux系统宝典

      ) ;0Bblinux系统宝典

添加一个子分区0Bblinux系统宝典

你可以在ALTER TABLE语句中使用MODIFY PARTITION ... ADD SUBPARTITION子句来向一个【范围|列表|间隔】-范围复合分区表添加一个范围子分区。对于一个间隔-范围分区表,你只能向范围分区或者已经物化的间隔分区添加子分区。0Bblinux系统宝典

下面的示例中,向shipments表添加一个新的范围分区,包含所有order_date字段值在2007年1月份并且delivery_date字段值大于等于2007年4月1日的数据。0Bblinux系统宝典

ALTER TABLE shipments0Bblinux系统宝典

  MODIFY PARTITION p_2007_jan0Bblinux系统宝典

      ADD SUBPARTITION p07_jan_vl VALUES LESS THAN (MAXVALUE) ;0Bblinux系统宝典

向引用分区添加一个分区或子分区0Bblinux系统宝典

就像分区和子分区可以被添加到范围分区表、哈希分区表、列表分区表或者符合分区表一样,我们可以在引用分区的定义中向父表添加分区或者子分区。添加操作自动级联到所有引用分区表中。当你向主表添加分区或者子分区时,你可以通过DEPENDENT TABLES子句来为相关表设置属性。0Bblinux系统宝典

添加索引分区0Bblinux系统宝典

你不能显式地给本地索引添加分区,相反,只有当你向基表中添加一个分区时,一个新的分区也会添加到本地索引中。具体来说,当你发出ALTER TABLE语句来向一个包含本地索引的表添加分区时,一个匹配的分区也会同时添加到本地索引中。数据库会给新的索引分区指定名称和默认物理存储属性,但是,在ADD PARTITION操作完成后你也可以对其重命名。0Bblinux系统宝典

你可以在ADD PARTITION操作中,通过首先修改索引的默认属性来给索引分区指定一个新的表空间。例如,设想有一个本地索引q1_sales_by_region_locix,隶属于列表分区表q1_sales_by_region。如果,在新增分区q1_nonmainland之前,如上文中“向列表分区表中添加分区”所示,你可以执行以下语句,那么相关的索引分区将会被创建在tbs_4表空间中。0Bblinux系统宝典

ALTER INDEX q1_sales_by_region_locix0Bblinux系统宝典

  MODIFY DEFAULT ATTRIBUTES TABLESPACE tbs_4; 0Bblinux系统宝典
 0Bblinux系统宝典

否则,在添加分区后,你必须使用以下语句将索引分区移动到tbs_4表空间。0Bblinux系统宝典

ALTER INDEX q1_sales_by_region_locix0Bblinux系统宝典

  REBUILD PARTITION q1_nonmainland TABLESPACE tbs_4;0Bblinux系统宝典

可以使用ALTER INDEX…ADD PARTITION语句来向全局哈希分区索引添加一个分区。数据库将会添加新的哈希分区,并且对索引的一个现存子分区的所有条目根据哈希函数重新进行哈希排列,并将其中的部分数据填充到新增分区索引中。下面的语句向索引hgidx添加分区索引p5。0Bblinux系统宝典

ALTER INDEX hgidx ADD PARTITION p5; 0Bblinux系统宝典
 0Bblinux系统宝典

你不能向全局范围分区索引添加分区,因为最高分区的边界值通常为MAXVALUE。为了添加一个新的最高分区,使用ALTER INDEX ... SPLIT PARTITION语句。0Bblinux系统宝典

更多相关信息见 专题页面 0Bblinux系统宝典



沪ICP备10206494号-4