分区表的索引
以下索引类型仅适用于分区表:分区索引、分区索引(PI)、数据分区二级索引(DPSI)和非分区二级索引(NPI或NPSI)。
分区的索引
分区索引是指物理分区的索引。 分区表中的任何索引(XML索引除外)都可以进行物理分区。
要创建分区索引,请在CREATE INDEX语句中指定PARTITIONED。
分区索引由多个数据集组成。 每个数据集对应一个表分区。 下图显示了分区索引和非分区索引的区别。
分区索引
分区索引是指用于划分表的一列或多列的索引。 通常不需要分区索引,因为 Db2 使用表控制的分区 ,其中分区方案(分区键和值限制)已在表定义中定义。
CREATE INDEX语句没有特定的SQL关键字来指定索引作为分区索引。 相反,如果CREATE INDEX语句中指定的索引键与分区键匹配,则索引是分区索引。 分区键是在CREATE TABLE语句的PARTITION BY子句中指定的列。 这些柱子将桌子隔开。 如果索引键与分区键的最左列和排序顺序(ASC/DESC)相同,则索引键与分区键匹配。
分区键与限制键值不同。 分区键定义了表格的分区列。 极限关键值定义了每个分区中包含的值。 具体来说, 限制键值是定义分区边界的分区键的值。 它是升序索引中分区键的最高值,或降序索引中分区键的最低值。 在分区...中指定了限制键值。 CREATE TABLE语句或ALTER TABLE语句的END AT子句。 指定的范围划分了表空间和相应的分区索引空间。
在早期 Db2 版本中创建的表可能仍然使用索引控制的分区 ,其中分区方案未作为表定义的一部分进行定义。 在这种情况下,需要分区索引来指定分区方案。 (分区键和值和限制键和值在CREATE INDEX语句的PART VALUES子句中指定。)
分区索引示例
例如,假设您创建了一个 AREA_CODES 表,其中包含按州划分的区号,方法是发出以下 CREATE TABLE 语句。
CREATE TABLE AREA_CODES
(AREACODE_NO INTEGER NOT NULL,
STATE CHAR (2) NOT NULL)
PARTITION BY RANGE (AREACODE_NO)
(PARTITION 1 ENDING AT (299),
PARTITION 2 ENDING AT (399),
PARTITION 3 ENDING AT (499),
PARTITION 4 ENDING AT (599),
PARTITION 5 ENDING AT (699),
PARTITION 6 ENDING AT (799),
PARTITION 7 ENDING AT (899),
PARTITION 8 ENDING AT (MAXVALUE));您也可以选择使用以下CREATE INDEX语句在示例表AREA_CODES上创建分区索引。 该索引不是必需的,因为 AREA_CODES 表的分区方案已在 CREATE TABLE 语句中定义,并且 AREA_CODES 使用表控制的分区。
CREATE INDEX AREACODE_IX1 ON AREA_CODES (AREACODE_NO)
CLUSTER PARTITIONED;下图显示了AREA_CODES表中的分区索引。
非分区索引(二级索引)
非分区索引即非分区索引或 二级索引。 您可以在表上创建二级索引,以强制执行唯一约束、对数据进行分组,或为查询提供数据访问路径。
索引的有用性取决于索引中的列和索引的基数。 您经常选择、合并、分组或排序的列是键的理想选择。 此外,大型表索引键中不同值的数量必须足以让 Db2 使用索引检索数据。 否则, Db2 可能会选择扫描表格空间。
您可以创建两种类型的二级索引:分区索引(称为数据分区二级索引)和非分区索引(称为非分区二级索引)。
- 数据分区辅助索引 (DPSI)
- 数据分区二级索引 (DPSI)是一种非分区索引,它根据基础数据的分区方案进行物理分区。
DPSI的分区数量与表空间中的分区数量相同。 每个DPSI分区仅包含对应表空间分区中各行的键。 例如,如果表空间有三个分区,DPSI分区1中的键仅引用表空间分区1中的行;DPSI分区2中的键仅引用表空间分区2中的行,以此类推。
限制:- 您只能在分区表空间中的表中创建DPSI。
- 您无法为按增长分区表空间创建数据保护服务接口。
- XML索引不能是DPSI。
要定义DPSI,请在CREATE INDEX语句中使用PARTITIONED关键字,并指定一个与分区键列不匹配的索引键。 如果您使用PARTITIONED关键字指定的索引的最左列与分区键匹配,则只有在匹配列的排序顺序不同时, Db2 才会创建仅包含DPSI的索引。
DPSI的使用促进了分区独立性,从而带来了以下性能优势:
- 使用PART选项消除并行LOAD实用程序作业之间的争用,该选项针对表空间的不同分区
- 便于分区级别的操作,例如添加分区或旋转分区使其成为最后一个分区
- 缩短分区表空间中二级索引的恢复时间
然而,使用DPSI并不总是能够提高查询性能。 例如,对于仅引用DPSI键中列的谓词的查询, Db2 必须遍历索引的每个分区,以查找满足谓词的值。
DPSI为满足以下所有条件的查询提供性能优势:
- 查询在DPSI列上有谓词。
- 查询包含表分区列的附加谓词,将查询限制为表分区的一个子集。
- 非分区二级索引(NPI或NPSI)
- 非分区二级索引 (NPI或NPSI)是指任何未定义为分区索引且未进行物理分区的索引。 NPI索引有一个索引空间,其中包含表空间所有分区行的键。
您可以在分区表空间中的表格中创建NPI。 这些索引不适用于非分区表空间。
尽管NPI没有物理分区,但它确实有逻辑分区。 逻辑分区是索引条目中与特定表空间分区相对应的子集。
NPIs为符合以下条件的查询提供性能优势:
- 查询不包含表分区列上的谓词,这些谓词会将查询限制在表分区的一个小子集中。
- 查询条件与索引列匹配。
- SELECT列表列包含在索引中(仅用于索引访问)。
DPSI和NPI的优势示例
- STATE列上的数据分区二级索引(DPSI)
- 假设表AREA_CODES没有按STATE列分区,则以下CREATE INDEX语句会在表AREA_CODES上创建一个DPSI。
CREATE INDEX DPSIIX2 ON AREA_CODES (STATE) PARTITIONED;以下示例查询可以高效地使用示例DPSI。 需要搜索的关键值仅限于限定分区的关键值,即分区关键值小于或等于300的关键值。
SELECT STATE FROM AREA_CODES WHERE AREACODE_NO <= 300 AND STATE = 'CA'; - 状态列上的非分区索引(NPI)
- 假设表AREA_CODES没有按STATE列分区,则以下CREATE INDEX语句会在表AREA_CODES上创建一个NPI。
CREATE INDEX NPSIIX3 ON AREA_CODES (STATE);以下查询可以高效地使用示例NPI。 需要搜索的关键值数量仅限于扫描大于“CA”的索引关键值。
SELECT STATE FROM AREA_CODES WHERE STATE > 'CA';
下图显示了示例索引的结构。
在公用事业处理方面,DPSI比NPI更具优势。 例如,复制、重建索引和恢复索引等实用程序可以在物理分区而不是逻辑分区上运行,因为数据分区的密钥位于单个DPSI分区中。 这种方法可以提高可用性。