创建分区索引

为分区表创建分区索引时,每个数据分区都将在它自己的索引分区中建立索引。 缺省情况下,索引分区与对应的数据分区存储在同一个表空间中。 索引中的数据根据表的分布键进行分布。

准备工作

本任务假定分区表已创建完毕。

关于本任务


限制

某些类型的索引不能进行分区:
  • 基于非分区数据的索引
  • 基于空间数据的索引
  • XML 列路径索引(由系统生成)
您必须始终作为非分区索引来创建这些索引。 另外,分区唯一索引的索引键必须包含表分区键中所有的列,而无论它们是由用户生成还是由系统生成。 后者将是系统创建索引以便对数据强制实施唯一约束或主约束的情况。

并且,创建分区索引时,不支持使用 CREATE INDEX 语句的 IN 子句。 缺省情况下,索引分区将在对应数据分区所在的表空间中进行创建。 要指定使用另一个表空间来存储索引分区,您必须使用 CREATE TABLE 语句的分区级 INDEX IN 子句逐个分区地为索引指定表分区。 如果省略此子句,那么索引分区将驻留在对应数据分区所在的表空间中。

过程

  1. 通过使用 PARTITIONED 子句,为表构造 CREATE INDEX 语句。
  2. 从受支持的 Db2® 接口执行 CREATE INDEX 语句。

示例

注: 这些示例仅用于说明目的,并不反映创建分区表或索引的最佳实践。
示例 1:在数据分区所在的表空间中创建分区索引。

在此示例中,假定 SALES 表的定义如下所示:

   CREATE TABLE sales(store_num INT, sales_date DATE, total_sales DECIMAL (6,2)) 
    IN ts1
   	PARTITION BY RANGE(store_num) 
      (STARTING FROM (1) ENDING AT (100), 
       STARTING FROM (101) ENDING AT (150),
       STARTING FROM (151) ENDING AT (200))
在此例中,表 SALES 的三个分区存储在表空间 ts1 中。 为这个表创建的任何分区索引也将存储在 ts1,其原因在于,这是用于存储此表的每个分区的表空间。 要根据存储器编号来创建分区索引,请使用以下语句:
     CREATE INDEX StoreNum ON sales(store_num) PARTITIONED

示例 2:为所有索引分区选择另一个位置。

在此示例中,假定 EMPLOYEE 表的定义如下所示:

     CREATE TABLE employee(employee_number INT, employee_name CHAR, 
                  job_code INT, city CHAR, salary DECIMAL (6,2)) 
                  IN ts1 INDEX IN ts2
        PARTITION BY RANGE (job_code)
        (STARTING FROM (1) ENDING AT (10) INDEX IN ts2,
         STARTING FROM (11) ENDING AT (20) INDEX IN ts2,
         STARTING FROM (21) ENDING AT (30) INDEX IN ts2)

要根据作业代码来创建分区索引,请使用以下语句:

     CREATE INDEX JobCode ON employee(job_code) PARTITIONED

在此示例中, EMPLOYEE 表的分区存储在表空间 ts1中,但是所有索引分区都将存储在 ts2中。

示例 3:在多个分区中创建索引。

假定已按如下方式来定义名为 PARTS 的表:
     CREATE TABLE parts(part_number INT, manufacturer CHAR, 
                  description CLOB, price DECIMAL (4,2)) IN ts1 INDEX in ts2
        PARTITION BY RANGE (part_number)
        (STARTING FROM (1) ENDING AT (10) IN ts3,
         STARTING FROM (11) ENDING AT (20) INDEX IN ts1,
         STARTING FROM (21) ENDING AT (30) IN ts2 INDEX IN ts4);
在本例中,PARTS 表包含 3 个分区:第一个分区在表空间 ts3 中,第二个分区在 ts1 中,第三个分区在 ts2 中。 发出了下列语句:
     CREATE INDEX partNoasc ON parts(part_number ASC)  PARTITIONED
     CREATE INDEX manufct on parts(manufacturer DESC) NOT PARTITIONED IN TS3;
于是,创建了两个索引。 第一个索引是分区索引,用于按部件号的升序对行进行排序。 第一个索引分区将在表空间 ts3 中创建,第二个索引分区在 ts1 中创建,第三个索引分区在 ts4 中创建。 第二个索引是非分区索引,用于按制造商名称的降序对行进行排序。 此索引将在 ts3 中创建。 注意,对于非分区索引而言,允许在 CREATE INDEX 语句中使用 IN 子句。 并且,在本例中,由于表 PARTS 是分区表,因此,要创建非分区索引,必须在 CREATE INDEX 语句中指定 NOT PARTITIONED 子句。