创建分区索引
为分区表创建分区索引时,每个数据分区都将在它自己的索引分区中建立索引。 缺省情况下,索引分区与对应的数据分区存储在同一个表空间中。 索引中的数据根据表的分布键进行分布。
准备工作
本任务假定分区表已创建完毕。
关于本任务
限制
某些类型的索引不能进行分区:
- 基于非分区数据的索引
- 基于空间数据的索引
- XML 列路径索引(由系统生成)
并且,创建分区索引时,不支持使用 CREATE INDEX 语句的 IN 子句。 缺省情况下,索引分区将在对应数据分区所在的表空间中进行创建。 要指定使用另一个表空间来存储索引分区,您必须使用 CREATE TABLE 语句的分区级 INDEX IN 子句逐个分区地为索引指定表分区。 如果省略此子句,那么索引分区将驻留在对应数据分区所在的表空间中。
过程
- 通过使用 PARTITIONED 子句,为表构造 CREATE INDEX 语句。
- 从受支持的 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 子句。