DB2 V9.7 for Linux, UNIX, and Windows

对分区表添加数据分区

创建分区表后,可以使用 ALTER TABLE 语句来修改该表。确切地说,可以使用 ADD PARTITION 子句来对现有分区表添加新数据分区。在下列情况下,对分区表添加数据分区要比连接数据分区更为合适:数据是随着时间的推移而添加到数据分区中的;数据是缓慢移动的而不是从外部源转入的;您直接将数据插入或装入到分区表中。特定的示例包括每天将数据装入到一月份数据的数据分区中或者持续不断地插入各行。

关于此任务

为了将新数据分区添加至特定表空间位置,会将 IN 子句作为 ALTER TABLE ADD PARTITION 语句中的选项来添加。

为了将新数据分区的分区索引添加至特定表空间位置(不同于该数据分区的表空间位置),会将分区级别 INDEX IN 子句作为 ALTER TABLE ADD PARTITION 语句中的选项来添加。如果没有指定任何 INDEX IN 选项,那么缺省情况下,新数据分区上的任何分区索引都将与该数据分区位于同一表空间中。如果分区表上存在任何分区索引,那么 ADD PARTITION 会为新分区创建对应的空索引分区。会将新索引分区条目插入到每个分区索引的系统目录表 SYSIBM.SYSINDEXPARTITIONS 中。

为了将新数据分区的长整型数据、LOB 或 XML 数据添加至特定表空间位置(不同于该数据分区的表空间位置),会将分区级别 LONG IN 子句作为 ALTER TABLE ADD PARTITION 语句中的选项来添加。

限制和用法准则

  • 不能对非分区表添加数据分区。要了解有关将现有表迁移到分区表的详细信息,请参阅将现有表和视图迁移到分区表
  • 每个新数据分区的值范围是由 STARTING 和 ENDING 子句确定的。
  • 必须至少提供 STARTING 和 ENDING 子句两者中的一个。
  • 新范围不能与现有数据分区的范围重叠。
  • 在第一个现有数据分区前面添加新数据分区时,必须指定 STARTING 子句。使用 MINVALUE 来使此范围的末端是开放的。
  • 同样,如果要在最后一个现有数据分区后面添加新数据分区,那么必须指定 ENDING 子句。使用 MAXVALUE 来使此范围的末端是开放的。
  • 如果省略了 STARTING 子句,那么数据库将在上一数据分区结束边界的紧后面建立开始边界。同样,如果省略 ENDING 子句,数据库就会在下一数据分区起始边界的紧前面建立结束边界。
  • 起始子句和结束子句的语法与 CREATE TABLE 语句中的指定语法相同。
  • 如果未对 ADD PARTITION 指定任何 IN、INDEX IN 或 LONG IN 子句,那么用来存放数据分区的表空间是使用 CREATE TABLE 语句所使用的方法选择的。
  • 包在 ALTER TABLE ...ADD PARTITION 操作期间会失效。
  • 一旦落实 ALTER TABLE 语句,新添加的数据分区就会变为可用。
通过在 ADD 操作中省略 STARTING 或 ENDING 边界,可以填充范围值间隔。以下示例使用 ADD 操作来填充间隔,在该操作中只指定了起始边界:
CREATE TABLE hole (c1 int) PARTITION BY RANGE (c1)
(STARTING FROM 1 ENDING AT 10, STARTING FROM 20 ENDING AT 30);
DB20000I 已成功完成 SQL 命令。
ALTER TABLE hole ADD PARTITION STARTING 15;
DB20000I 已成功完成 SQL 命令。
SELECT SUBSTR(tabname, 1,12) tabname,
SUBSTR(datapartitionname, 1, 12) datapartitionname,
seqno, SUBSTR(lowvalue, 1, 4) lowvalue, SUBSTR(highvalue, 1, 4) highvalue
FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='HOLE' ORDER BY seqno;
TABNAME DATAPARTITIONNAME SEQNO LOWVALUE HIGHVALUE
------------ ----------------- ----------- -------- ---------
HOLE PART0 0 1 10 
HOLE PART2 1 15 20 
HOLE PART1 2 20 30 

     选择了 3 个记录。
示例 1: 对现有分区表添加数据分区,该分区存放 901 到 1000 之间的值(包含端值)。假定 sales 表存储了 9 个范围(0-100 和 101-200 等等),最大值为 900。本示例在表的末尾添加一个附加范围,此范围由未包括的 STARTING 子句指示:
 ALTER TABLE sales ADD PARTITION dp10
ENDING AT 1000 INCLUSIVE

为了将新数据分区的分区索引添加至特定表空间位置(不同于该数据分区的表空间位置),会将分区级别 INDEX IN 子句作为 ALTER TABLE ADD PARTITION 语句中的选项来添加。如果没有指定任何 INDEX IN 选项,那么缺省情况下,新数据分区上的任何分区索引都将与该数据分区位于同一表空间中。如果分区表上存在任何分区索引,那么 ADD PARTITION 会为新分区创建对应的空索引分区。会将新索引分区条目插入到每个分区索引的系统目录表 SYSIBM.SYSINDEXPARTITIONS 中。

示例 2:将数据分区添加至现有分区表中,从而将长整型数据和索引与该数据分区的其余内容分离。
ALTER TABLE newbusiness ADD PARTITION IN tsnewdata
INDEX IN tsnewindex LONG IN tsnewlong