Oracle 11g维护分区(一)

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

向范围分区表添加一个分区

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

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

ALTER TABLE sales

ADD PARTITION jan99 VALUES LESS THAN ( '01-FEB-1999' )

TABLESPACE tsx;

另外,和范围分区表相关的本地索引和全局索引仍然可用。

向哈希分区表添加一个分区

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

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

ALTER TABLE scubagear ADD PARTITION;

ALTER TABLE scubagear

ADD PARTITION p_named TABLESPACE gear5;

索引可能被标识为UNUSABLE,如下表所述:

表类型

 

索引操作

 

普通表(堆表)

 

除非你在ALTER TABLE语句中指定UPDATE INDEXES字句:

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

所有全局索引,或者分区全局索引的所有分区,被标识为UNUSABLE,必须重建。

 

索引组织表

 

对于本地索引,和普通表的处理方式一样。

所有全局索引保持可用;

 

向列表分区表添加一个分区

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

ALTER TABLE q1_sales_by_region

ADD PARTITION q1_nonmainland VALUES ('HI', 'PR')

STORAGE (INITIAL 20K NEXT 20K) TABLESPACE tbs_3

NOLOGGING;

描述新增分区的集合内的所有值不能存在于表的其他分区。

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

与列表分区表相关的本地和全局索引均保持可用。

向间隔分区表添加一个分区

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

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

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

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

ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');

ORA-14767: Cannot specify this interval with existing high bounds

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

LOCK TABLE transactions PARTITION FOR(TO_DATE('31-JAN-2007','dd-MON-yyyy') IN SHARE MODE;

ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');

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

如果要禁用transactions表的间隔分区,使用以下语句:

ALTER TABLE transactions SET INTERVAL ();

向哈希复合分区表添加分区

可以在分区和哈希子分区两个级别来添加分区。

添加一个分区

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/50ff20e6adafb44a77b36cd43ffdb2c2.html