CREATE INDEX 语句
CREATE INDEX语句在当前服务器上创建分区索引或二级索引以及索引空间。 索引键中的列是当前服务器上表的列。
调用 CREATE INDEX
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
授权 CREATE INDEX
以下定义的特权套装必须至少包含以下一项:
- 桌面上的INDEX特权
- 对表的所有权
- DBADM 包含表格的数据库权限
- 系统 DBADM
- SYSADM 或 SYSCTRL 权限
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
如果索引名称是隐式限定的,或者角色是索引的所有者,则权限集必须包括以下内容之一:
- 模式上的 CREATEIN 权限
- 系统 DBADM
- SYSADM 或 SYSCTRL 权限
如果数据库是隐式创建的,则数据库权限必须位于隐式数据库或 DSNDB04 上。
如果索引是使用表达式创建的,则索引表达式中调用的任何用户定义函数都需要EXECUTE权限。
可能需要附加特权,如BUFFERPOOL和USING STOGROUP子句的描述中所述。

权限设置:
如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。 如果应用程序绑定在受信任上下文中,并指定了 ROLE AS OBJECT OWNER 子句,则角色就是索引的所有者,权限集就是该角色所拥有的权限。
如果语句是动态编写的,则权限集是进程的 SQL 授权 ID 所拥有的权限。 如果进程处于受信任上下文中,且指定了 ROLE AS OBJECT OWNER 子句,则特权集就是与进程的主授权 ID 相关联的角色所拥有的特权集,索引的所有者就是该角色。
如果 "ROLE AS OBJECT OWNER "未生效,且索引是显式限定符,则显式限定符是索引的所有者,权限集必须包括以下内容之一:
- 数据库的 DBADM 或 DBCTRL 权限
- 系统 DBADM 权限
- SYSCTRL 权限
- SYSADM 权限

语法 CREATE INDEX
其他选项:
- 1 同一条款不得重复出现。
- 2 默认情况下,现场PAD INDEXES BY DEFAULT(在安装面板DSNTIPE上)的值决定了默认值。 当值为NO时,默认值为NOT PADDED。 当值为“是”时,默认值为“填充”。 更多信息,请参阅“带衬垫”或“不带衬垫”选项的描述。
xml-index-specification
XML模式子句
序言
pattern-expression
forward-axis
function-step
sql-data-type
使用说明
自由规格
gbpcache 规范
描述 CREATE INDEX
- UNIQUE
- 防止表中包含两行或更多行具有相同索引键值的记录。 当使用UNIQUE时,一列的所有空值都被视为相等。 例如,如果键是一个可以包含空值的单列,则该列只能包含一个空值。 当更新表格中的行或插入新行时,约束条件生效。
在执行CREATE INDEX语句时也会检查约束。 如果表中已经包含具有重复键值的行,那么不会创建索引。
- UNIQUE WHERE NOT NULL
- 防止表中包含两行或更多行具有相同索引键值的行,其中不考虑所有空值的列相等。 允许多个空值。 否则,这与 UNIQUE。
- INDEX 索引名称
- 为索引命名。 该名称不得标识当前服务器上存在的索引,也不得标识 SYSIBM.SYSPENDINGOBJECTS 目录表中或仅加速器表中列出的索引。
相关索引空间也有一个名字。 该名称作为限定词出现在为索引定义的数据集名称中。 如果数据集由用户管理,则名称与索引名称的第二部分(或唯一部分)相同。 如果此标识符包含八个以上的字符,则仅使用前八个字符。 索引空间的名称在数据库中标识表的索引空间和表空间名称中必须是唯一的。 如果数据集由 Db2 定义,则 Db2 会生成一个唯一的名称。
如果索引是已声明临时表的索引,则限定符(如果明确指定)必须为SESSION。 如果索引名称不明确, Db2 会使用 SESSION 作为隐式限定符。
更多信息,请参阅索引名称和指南。
- ON 表名或辅助表名
- 标识创建索引的表格。 该名称可以标识基本表、具体化查询表、已声明临时表或辅助表。
- table-name
- 标识创建索引所基于的表、具体化查询表或已声明的临时表。 名称必须标识当前服务器上存在的表。 (已声明的临时表名必须以SESSION限定。)
名称不得识别克隆表。 该名称不得用于标识临时表或为XML列隐式创建的表。 如果创建的索引用于XML值,则表中可以包含一个XML列,否则表中不能包含XML列。 如果使用表达式创建索引,则名称不得标识目录表或已声明的临时表。
该名称不得标识仅用于加速器的表或目录表。
如果表格已强制执行行或列访问控制,则在密钥生成期间不会应用行权限和列掩码。
- 列名……
- 指定索引键的列。
每个列名必须标识表格中的一列。 请勿指定超过64列,或同一列多次。 不要限定列名。
请勿为定义如下列名的列指定列名:
- LOB列(或基于LOB数据类型的特定类型列)
- 当同时指定了分区范围子句时,二进制或变长二进制列(或具有基于二进制或变长二进制数据类型的不同类型的列)
- 当同时指定了 PADDED 子句时,VARBINARY 列(或基于 VARBINARY 数据类型的不同类型的列)
当同时指定 PARTITION BY RANGE 或 PARTITIONED 子句时,行更改时间戳列。 
- 当同时指定了分区或范围分区子句时,带有时区列的时间戳(或基于带有时区数据类型的时间戳的具有不同类型的列)。
只有在指定了XMLPATTERN子句的情况下,才能指定XML类型的列。 如果指定了 XMLPATTERN 子句,则只能识别一个列,且该列必须是 XML 类型。 生成的索引是一个XML索引。
如果表是带有 Unicode 列的 EBCDIC 表,则为索引键指定的字符和图形列必须全部为 EBCDIC 或全部为 Unicode。
列的长度属性之和不得大于以下限制,其中 n 为可包含空值的列数, m 为长度不等的列数, d 为键中 DECFLOAT 列数:- 2000 - n 表示带衬垫的非分隔索引
- 2000 - n - 2m - 3d ,用于无填充、无分隔的索引
- 2 55 - n 用于分区索引(填充或不填充)
- 255 - n - 2m- 3d ,用于无填充分隔索引

- 关键词
- 指定一个返回标量值的表达式。 具有包含一个或多个表达式(不仅仅是列名)的键的索引是基于表达式的索引。 无法使用GENERATE KEY USING子句或INCLUDE子句指定 key-expression。 关键词表达有以下限制:
- 每个关键表达式必须至少包含对表名列的引用。
所有对表名列的引用都必须是无限制的。 参考列不能包含任何FIELDPROC或安全标签。 引用列不能被隐式隐藏(即使用IMPLICITLY HIDDEN属性定义)。
- 关键词表达不得包含以下内容:
- 子查询
- 聚合函数
- 非确定性函数
- 具有外部操作的函数
- 用户定义的函数
- VERIFY_GROUP_FOR_USER或VERIFY_ROLE_FOR_USER函数
- 顺序引用
- 主变量
- 参数标记
- 全局变量
- 专用寄存器
- 隐式时区值适用的表达式(例如,将时间戳转换为带时区的时间戳)
- CASE 表达式
- OLAP 规范
如果关键表达式调用了投影函数,则权限集必须隐含地包含 EXECUTE 权限,用于生成不同类型的投影函数。
如果键表达式调用 LOWER 或 UPPER 函数,输入的字符串表达式不能是 FOR BIT DATA,并且函数调用必须包含本地名称参数。
如果 key-expression 调用 TRANSLATE 函数,函数调用必须包含 to-string 参数。
key-expression 不得调用带有引用 LOB 列的参数的内置函数,除非该函数是 SUBSTR 或 JSON_VAL。
如果 key-expression 调用了 SUBSTR 函数,那么引用 LOB 列的函数参数只能引用 LOB 列的内联部分。
如果 key-expression 调用 JSON_VAL 函数,且第一个参数是 LOB 列,则该列必须定义为内联 LOB。
如果 key-expression 调用 JSON_VAL 函数,函数调用必须满足以下条件:- JSON_VAL函数的调用必须是键表达式最外层的表达式。
- 如果第一个参数是列,则该列必须包含在分区增长表空间中的表中。
- 第三个参数必须以字符串“:na”结尾,以表明第一个参数不包含JSON数组。

如果键表达式调用了 JSON_VAL 内置函数,则 CREATE INDEX 语句不得引用任何 LOB 列,但作为 JSON_VAL 函数参数的 LOB 列除外。 这样的 CREATE INDEX 语句只能引用单个 LOB 列。
- 同一索引中不能重复使用同一表达。
- 表达式结果的数据类型不能是LOB、XML、DECFLOAT或数组值。 然而,中间结果的数据类型可以是LOB或DECFLOAT值(或基于这些数据类型之一的不同类型),但不能是XML值。 对于包含 DECFLOAT 中间结果的索引,创建索引时使用的舍入模式在使用该索引时也应有效。
- 如果在键表达式中引用了EBCDIC表中的Unicode列,则索引键的编码方案必须为全部Unicode或全部EBCDIC。 否则, 键表达式结果的编码方案必须与表格的编码方案相同。
每个关键词表达式的文本字符串在转换为 UTF-8 后最大长度为4000字节。 扩展索引中的关键词表达式最大数量为64。
- 每个关键表达式必须至少包含对表名列的引用。
- ASC
- 按列将索引条目升序排列。 ASC不能与GENERATE KEY USING子句一起使用。
ASC是默认设置。
- DESC
- 按列将索引条目降序排列。 DESC不能与GENERATE KEY USING子句一起指定,或者ON子句包含密钥表达式。
- RANDOM
- 索引条目按列随机排序。 在下列情况下不能指定 RANDOM:
- 索引键中包含一个长度可变的列,索引使用“无填充”选项定义
索引键的一列定义为 TIMESTAMP WITH TIME ZONE 或 DECFLOAT
- 索引是一个XML索引。 XML索引由GENERATE KEY USING子句定义
- 索引是分区密钥的一部分
- 该索引是一个基于表达的索引
- BUSINESS_TIME
- 指定BUSINESS_TIME期间的列按以下顺序自动添加到索引键的末尾:
- BUSINESS_TIME 周期的结束列(按升序排列)
- 按升序排列的BUSINESS_TIME时段的开始列
BUSINESS_TIME可以指定为列表中的最后一项。 列表中必须至少包含一个列名或关键表达式。 当指定了 BUSINESS_TIME 时,BUSINESS_TIME 期间的列不能指定为列名或键表达式 ,也不能指定为分区键中的列。

- 有重叠或无重叠
- 指示对于非周期列和行索引键的表达式,是否存在多行具有相同值的情况,且时间周期重叠。

- 辅助表名称
- 标识创建索引的辅助表。 名称必须标识当前服务器上存在的辅助表。 如果辅助表已经有一个索引,则不要创建另一个。 辅助表只能有一个索引。
不要为索引键指定任何列。 密钥值隐式定义为系统生成的19字节唯一值。
如果合格, 表名或辅助表名可以是两部分或三部分的名字。 如果使用由三个部分组成的名称,则第一个部分必须与当前服务器上安装面板 DSNTIPR 的 Db2 位置名称字段中的值相匹配。 (如果当前服务器不是本地服务器 Db2 ,则该名称不一定是当前服务器特殊寄存器中的名称。) 无论名称是两部分还是三部分,限定名称的授权ID都是索引的所有者。
包含指定表的表空间必须对 Db2 可用,以便打开其数据集。 如果表格空间启用了EA,则索引的数据集必须定义为属于 DFSMS 数据类,该数据类具有扩展格式和可寻址属性。
- GENERATE KEY USING
- 除了XMLPATTERN,生成XML索引还需要使用GENERATE KEY。
- XMLPATTERN
- 当XML列被索引时,只有文档的一部分会被索引。 为了识别这些部分,指定了遵循XMLPATTERN子句的路径表达式。 只有与指定模式匹配的元素、属性或文本节点的值才会被编入索引。 可以使用可选的命名空间声明来指定XML模式,其中命名空间前缀映射到命名空间URI,并提供路径表达式。 路径表达式与XQuery中的路径表达式类似,但为XML索引指定的路径可以支持子轴、自身或后代轴、通配符表达式或仅属性。 XML模式文本的最大长度为4000字节,转换为 UTF-8 后。 有关XQuery的更多信息,请参阅 pureXML 概述。
- 序言
- 要在模式表达式中使用限定名称,需要声明命名空间前缀。 还可以声明默认命名空间,用于非限定名称。
- 声明命名空间 NCName = StringLiteral
- 命名空间前缀 NCName 映射到命名空间 URI,该 URI 在 StringLiteral。 可以声明多个命名空间,但每个命名空间的前缀在命名空间声明列表中必须是唯一的。 NCName 是XML 1.0 标准定义的XML名称。 NCName 不能包含冒号字符。 命名空间统一资源标识符不能是
http://www.w3.org/XML/1998/namespace或http://w3.org/2000/xmlns/。 - 声明默认元素名称空间 StringLiteral
- 为元素和类型的不合格名称指定默认命名空间URI。 StringLiteral 是一个命名空间URI。 如果没有声明默认元素命名空间,则元素和类型的无限定名称将不处于任何命名空间中。 只能声明一个缺省名称空间。
- 模式表达
- 模式表达式用于识别XML文档中已建立索引的节点。 模式表达式不能为空字符串或无效字符串, XQuery 表达式嵌套不能超过50层。 模式表达式不能是 XQuery 更新表达式。
- / (斜线 )
- 将各个路径表达式步骤分隔开。
- // (双斜杠 )
- /descendant-or-self::node()/的缩写语法
- (点)
- /self::node()/的缩写语法
- child::
- 指定上下文节点的子代。 child:: 如果没有指定前轴,则默认为此选项。
- descendant::
- 指定上下文节点的后代。
- self::
- 指定当前上下文节点。
- descendant-or-self::
- 指定上下文节点和上下文节点的后代。
- 元素名称
- 标识XML文档中的元素。 元素名称是一个XML QName,可以有以下几种形式:
- nsprefix :NCName
- nsprefix 明确指定了必须声明的命名空间前缀。
- NCName
- 使用默认命名空间的无限定XML名称。
- * (星号)
- 表示任何元素名称。 如果*前面带有attribute::或@,则表示任何属性名称。
- nsprefix: *
- 指示指定命名空间中的任何 NCName。
- * :NC名称
- 在当前声明的任何命名空间中指定特定的XML名称。
- 属性: :或@
- 指定上下文节点的属性。
- 属性名
- 标识XML文档中的属性。 属性名称是一个XML QName,可以有以下几种形式:
- nsprefix :NCName
- nsprefix 明确指定了必须声明的命名空间前缀。
- NCName
- 使用默认命名空间的无限定XML名称。
- 文本()
- 与任何文本节点相匹配。
- fn:upper-case(.)
- 指定一个元素节点或属性节点,用于标识上下文步骤 (模式表达式中在fn:upper-case之前指定的部分)中指定的每个节点的索引的键值。
fn:upper-case()的上下文步骤必须指定一个元素节点或属性节点。 fn:upper-case()的参数必须是一个自步长。 XML值索引的关键值必须指定为SQL数据类型VARCHAR。 VARCHAR值的值可以是 Db2 中允许的任何值。
- fn:exists()
- 指定一个元素节点,用于标识上下文步骤 (模式表达式中在fn:exists之前指定的部分)中每个节点的索引的键值。
fn:exists()的上下文步骤必须指定一个元素节点。 fn:exists()参数必须是一个子元素节点或属性节点的单个步骤。 名称测试部分可以是命名空间前缀或NCName的通配符。 对于以fn:exists()结尾的XPath表达式,XML值索引的关键值必须指定为SQL数据类型VARCHAR(1)。 关键值是“T”或“F”。 “T”表示fn:exists()的计算结果为真,“F”表示fn:exists()的计算结果为假。
- AS SQL 数据类型
- 指定索引值作为指定SQL数据类型的实例进行存储。 将数据类型转换为指定类型可能会导致数值精度降低。 例如,当XML整数值转换为SQL数据类型DECFLOAT时,可能会出现精度损失。 如果因舍入导致精度损失,则结果在存储到索引时会被舍入为近似值。 结果不能超出SQL数据类型支持的范围内。 如果无法将值转换为指定的数据类型,则文档仍会插入到表中,但不会创建该值的索引条目。 没有错误或警告代码返回。如果索引是唯一的,则在将值转换为指定类型后,将强制该值唯一。 因为在转换为SQL数据类型时可能会发生舍入,如果某个值被转换为与表已包含的文档相同的键值,则 Db2 会在插入时返回重复键错误,或者无法创建索引。
- VARCHAR ( 整数 )
- 长度整数值在1-1000字节之间。 如果为VARCHAR指定了长度,则指定的长度将被视为约束。 如果插入到表中的文档(或在创建索引时存在于表中)的节点值超过指定长度,则插入或创建索引将失败。
- DECFLOAT
- DECFLOAT可以指定数值索引。 要使转换成功,字符串必须是有效的XML数字类型。 否则,该值将被忽略,索引中也不会出现任何插入。 演员阵容的结果不能超出DECFLOAT所能代表的范围。 由于数值类型的XML Schema数据类型比SQL数据类型允许更高的精度,因此结果可能会被四舍五入,以符合SQL数据类型。 索引中存储的DECFLOAT值是标准化数值。
- DATE
- SQL DATE数据类型的值在存储到索引中之前,将统一为UTC(协调世界时)。 对于无效的xs:date值,该值将被忽略,不会插入索引。 XML模式中的日期数据类型比SQL数据类型更精确。 如果遇到超出范围的值,那么将返回错误。
- TIMESTAMP (12)
- SQL TIMESTAMP数据类型的值在存储到索引中之前,将统一为UTC(协调世界时)。 如果文档中指定的值没有指定时区, Db2 将使用隐式时区将值标准化为UTC。 对于无效的 xs:dateTime 值,该值将被忽略,不会插入索引。 XML模式数据类型的时间戳比SQL数据类型更精确。 如果遇到超出范围的值,那么将返回错误。 SQL TIMESTAMP索引键的精度只能达到12位小数。
- INCLUDE ( 列名 )
- 指定附加列,以附加到唯一索引的索引键列集。 任何使用 INCLUDE 列名指定的列不用于确保唯一性。 对于仅使用索引访问的某些查询,包含的列可能会提高性能。
当指定了“包含”时,必须指定“唯一”条款。 在包含子句中指定的列计入列数限制和索引中指定的列长度属性总和限制。 索引的列总数不能超过64。
列名必须与用于强制唯一性的列以及包含子句中指定的其他列不同。 列名必须是未限定的,必须标识指定表的列,且不能是索引中已有的列之一。 列名不能标识LOB或DECFLOAT列(或基于这些类型之一的不同类型)。
下列索引类型不能指定包含子句:
- 非唯一索引
- 使用索引控制分区时的分区索引
- 辅助索引
- XML索引
- 扩展索引
- 基于表达的索引
INCLUDE列表中定义为字符或图形字符串数据类型的列必须使用与其它字符或图形字符串数据类型的关键列相同的编码方案进行定义。
- CLUSTER 或者 NOT CLUSTER
- 指定索引是否是表的聚簇索引。 辅助表或定义为使用哈希组织的表中的索引不得指定此子句。
- CLUSTER
- 该索引将用作表的聚簇索引。 如果指定了XMLPATTERN或键表达式 ,则无法指定CLUSTER。
- 非集群
- 该索引不能用作表的聚簇索引。
- PARTITIONED
- 指定索引是否按数据分区(即根据基础数据的分区方案进行分区)。 分区索引只能创建在按范围分区通用表空间(UTS)或按范围分区(非UTS)表空间中的表中。 在按增长分区的 UTS 中,无法在表上创建分区索引。 如果指定了XMLPATTERN,则无法指定PARTITIONED。 分区索引的类型包括分区索引和二级索引。
如果指定的索引键列与分区键中指定的列匹配或包含其超集,且顺序相同,且具有相同的升序或降序属性,则该索引被视为分区索引。
如果指定了分区,则带有优先级和后继级规格的USING规格是可选的。 如果未指定这些空间参数,则使用默认值。
二级索引是指在分区表空间中定义的任何不符合分区索引定义的索引。 仅当索引中的列是分区列的超集时,才允许使用UNIQUE和UNIQUE WHERE NOT NULL。 所有索引列都必须在 table-name ( column-name ) 子句中指定,而不是在 INCLUDE 子句中指定。 如果在使用索引控制的分区上创建了分区二级索引,则该表将转换为使用表控制的分区。
- 无衬垫或衬垫
指定如何在索引中存储长度不同的字符串列。 如果索引中不包含长度不同的列,则忽略此选项并返回警告消息。 没有长度可变字符串列的索引总是作为物理填充索引创建。
带缓冲区的索引在某些情况下可能阻止仅通过索引访问数据。 有关更多信息,请参阅带填充或不带填充的索引。
- 无填充
- 指定在索引中,不同长度的字符串列不会填充到最大长度。 可变长度列的长度信息与键一起存储。
如果索引是在辅助表上创建的,则忽略NOT PADDED,且其不起作用。 辅助表中的索引总是填充的。
- PADDED
- 指定索引中长度不同的字符串列总是用默认填充字符填充到最大长度。 如果指定了XMLPATTERN,则不能指定PADDED。 对于在VARBINARY列上定义的索引,不能指定PADDED。
当索引包含至少一个可变长度列时,PADDED或NOT PADDED选项的默认值取决于PADIX子系统参数的值。 有关更多信息,请参阅默认PAD索引字段(PADIX子系统参数)。
- 当该字段的值为NO时,除非指定了PADDED,否则不会填充新的索引。
- 当此字段的值为“是”时,除非指定“不填充”,否则将填充新的索引。
- 使用(非分区索引)
- 对于非分区索引,USING子句指示索引的数据集是由用户管理还是由 Db2 管理。 如果指定了 Db2 定义,则该子句还给出了空间分配参数(PRIQTY和SECQTY)和擦除规则(ERASE)。
如果您省略了 USING,则 Db2 将在与表关联的数据库的默认存储组中列出的卷上管理数据集。 数据库的默认存储组必须存在。 在没有 USING 子句的情况下,PRIQTY、SECQTY 和 ERASE 采用默认值。
- VCAT 目录名称
- 指定索引的第一个数据集由用户管理,后续数据集(如有需要)也由用户管理。
数据集是VSAM线性数据集,在集成目录工具目录中编目, 目录名称为 有关目录名称值的更多信息,请参阅 SQL中的命名约定。
多个 Db2 子系统可以与当前服务器共享集成目录设施目录。 为了避免这些子系统尝试为不同的数据集指定相同名称,请指定一个其他 Db2 子系统未使用的目录名称值。
在以下任何一种情况下,请勿指定VCAT:
- 用于已声明临时表的索引。
- 如果表格空间是按增长进行分区,且表格空间不属于 Db2 目录。
- STOGROUP stogroup-name
- 指定由 Db2 定义和管理索引的数据集。 每个数据集将在已识别存储组中列出的卷上定义。 PRIQTY和SECQTY的指定值(或默认值)决定了数据集的主次分配。 如果 PRIQTY+118×SECQTY 等于或大于2GB,则最终可能使用多个数据集,但执行此语句时仅定义第一个数据集。
要使用 USING STOGROUP,权限集必须包含以下任一内容(除非在声明全局临时表上创建索引时,且存储组名称与工作文件数据库的默认存储组匹配):- SYSADM 权限
- SYSCTRL 权限
- 该存储组的 USE 权限

此外 ,stogroup-name 必须标识当前服务器上存在的存储组,并在其描述中至少包含一个卷序列号。 描述中可以说明,卷的选择将由存储管理子系统(SMS)决定。 存储组中指定的每个卷都必须对 z/OS® 开放,以便动态分配数据集,并且所有这些卷必须具有相同的设备类型。
用于存储组的集成目录设施目录不得包含索引的第一个数据集的条目。 如果目录受密码保护,则存储组的描述必须包含有效的密码。
存储组提供数据集名称。 第一级预选赛也是集成目录工具的名称或别名,数据集将在该目录中进行分类。 数据集的命名规则与用户管理数据集时相同。
- PRIQTY 整数
- 指定由 Db2 管理的数据集的最小主空间分配。 integer 必须是正整数,或者 -1。 当您指定PRIQTY为正整数时,主空间分配至少为 n千字节 ,其中 n 为:
- 12
- 如果整数大于0且小于12。
- integer
- 如果整数在12-4194304的范围内。
- 2097152
- 如果以下两个条件都成立:
- 整数大于2097152。
- 该索引是一个非分区索引,位于未定义LARGE或DSSIZE属性的表空间上。
- 4194304
- 如果整数大于4194304。
如果您没有指定PRIQTY,或者您指定的PRIQTY值为 -1 , Db2 将使用默认值进行主空间分配。 有关 Db2 如何确定默认值的信息,请参阅主要和次要空间分配规则。
如果您指定了 PRIQTY,但没有指定 -1 的值,则 Db2 将使用 4KB 的最小倍数(不小于 n )指定访问方法服务的主要空间分配。 分配的空间可能大于 Db2 所申请的空间。 例如,它可能是满足所需空间的最少轨道数。 要更准确地估算实际存储量 , 请参阅DEFINE CLUSTER命令。
在确定PRIQTY的合适值时,请注意, Db2 可能会将主空间中的两页用于存储索引条目以外的其他用途。
- SECQTY 整数
- 指定由 Db2 管理的数据集的最小辅助空间分配。 整数必须为正整数、0或 -1。 如果您没有指定SECQTY,或者指定的SECQTY值为 -1 , Db2 将使用公式来确定一个值。 关于用于辅助空间分配的实际价值的信息,无论您是否指定了数值,请参阅主要和辅助空间分配规则。
如果您指定了 SECQTY,且未指定值 -1 ,则 Db2 指定访问方法服务的辅助空间分配,使用 4KB 的最小倍数且不小于整数。 分配的空间可能大于 Db2 所申请的空间。 例如,它可能是满足所需空间的最少轨道数。 要更精确地估算实际存储量 , 请参阅DEFINE CLUSTER命令。
- 擦除
- 指示在执行删除索引的实用程序或SQL语句时,是否删除由 Db2 管理的数据集。
- 否
- 不会删除数据集。 涉及数据集删除的操作将比“ERASE YES”执行得更好。 不过,数据仍然可以访问,但不是通过 Db2。 这是缺省值。
- 是
- 删除数据集。 作为安全措施, Db2 在删除数据集中的所有数据前,会用0覆盖这些数据。
- 自由规格
- 自由页面整数
- 指定在执行 Db2 实用程序时创建索引条目,或为已有行的表创建索引时,每隔多长时间留出空白页。 每页整数页后 ,可免费增加一页。 整数的取值范围为0-255。 默认值为0,没有空闲页面。
在声明的临时表上,不要将自由页指定为索引。
- PCTFREE 整数
- 当通过执行 Db2 实用程序将条目添加到索引或索引分区时,或者为包含现有行的表创建索引时,确定每个非叶页和叶页中要保留的可用空间百分比。 页面中的第一个条目不受限制地加载。 当非叶页或叶页中放置了其他条目时,可用空间百分比至少等于整数。
整数值的范围为0到99,但如果指定了大于10的值,非叶页面中仅会保留10%的可用空间。 缺省值为 10。
对于已声明的临时表上的索引,不要指定PCTFREE。
对于分区索引,特定分区的 FREEPAGE 和 PCTFREE 值由以下选项中第一个适用选项给出:
- 在分区子句中给出的该分区的FREEPAGE和PCTFREE值。 在任何分区条款中,不要使用多个免费规格。
- 在自由规格中给出的值,不在任何分区条款中。
- 默认值FREEPAGE 0和PCTFREE 10。
- gbcache-规格
- GBPCACHE
- 在数据共享环境中,指定写入组缓冲池的索引页面。 在非数据共享环境中,除非索引位于已声明的临时表中,否则该选项将被忽略。 在数据共享或非数据共享环境中,请勿将GBPCACHE指定为已声明临时表上的索引。
- 已更改
- 当索引或分区存在Db2 读写需求时,指定将更新的页面写入组缓冲池。 当没有互Db2 读/写操作时,不使用组缓冲池。 当数据共享组中不止一个成员打开索引或分区,且至少有一个成员将其打开进行更新时,就存在跨Db2 R/W 兴趣。 GBPCACHE CHANGED是默认值。
如果索引位于定义为 GBPCACHE(NO) 的组缓冲池中,则忽略 CHANGED,且不会向组缓冲池写入任何页面。
- 全部
- 表示页面从DASD读取时写入组缓冲池。例外情况 :如果只有一个更新 Db2 子系统,且没有其他 Db2 子系统对页面集感兴趣,则不会向组缓冲池写入任何页面。
如果索引位于定义为GBPCACHE(NO)的组缓冲池中,则ALL将被忽略,且不会向组缓冲池写入任何页面。
- 无
- 表示没有页面写入组缓冲池。 Db2 仅将组缓冲池用于交叉验证。
对于分区索引,特定分区的 GBPCACHE 值由以下选项中适用者中的第一个给出:
- 在分区子句中为该分区给出的 GBPCACHE 的值。 在任何分区条款中,不要使用多个 gbpcache-specification。
- gbpcache-specification中给出的值,不在任何PARTITION子句中。
- GBPCACHE CHANGED是默认值。
- DEFINE
- 指定索引的基础数据集何时被实际创建。 目录表 SYSINDEXPART 中的 SPACE 列用于记录数据集的状态(未定义或已分配)。 如果未指定关键字“定义”,则定义属性将从基础表空间的当前状态继承。
- YES
- 数据集在创建索引时创建(执行CREATE INDEX语句)。
- NO
- 只有在数据被插入索引后,数据集才会创建。
定义“否”仅适用于 Db2 管理的数据集(指定使用STOGROUP)。 使用定义 NO,尤其是在创建索引语句的性能很重要或 DASD 资源有限的情况下。
如果您使用 Db2 之外的程序将数据传播到定义了该索引的表中,请不要在索引上使用“定义否”。 如果在表的索引上使用定义 NO,然后数据从 Db2 之外的程序传播到表中,索引空间数据集将被分配,但 Db2 目录不会反映这一事实。 因此, Db2 将索引空间中的数据集视为尚未分配的数据集。 由此导致的不一致性导致 Db2 拒绝应用程序访问数据,直到不一致性得到解决。
对于用户管理的数据集,DEFINE NO将被忽略(指定了USING VCAT)。 如果索引是在非空表中创建的,则“定义否”也会被忽略。
如果索引是在涉及克隆关系的基表上创建的,请不要指定定义为“否”。
对于已声明的临时表的索引,请勿指定DEFINE NO。
- COMPRESS NO 或者 COMPRESS YES
- 指定是否对索引数据进行压缩。 如果索引被分区,则该子句将应用于所有分区。
- COMPRESS NO
- 指定不使用索引压缩。
默认值为压缩否。
- COMPRESS YES
- 指定将使用索引压缩。 用于创建索引的缓冲池的大小必须为 8K、 16K 或 32K。 磁盘上的物理页面大小为 4K。 索引压缩将立即开始。
对于顺序插入操作很少或没有删除操作的应用程序,建议使用索引压缩。 随机插入和删除可能会对压缩产生不利影响。 索引压缩也适用于主要为了扫描操作而创建索引的应用。
- INCLUDE NULL KEYS 或者 EXCLUDE NULL KEYS
- 指定当每个关键列包含NULL值时是否创建索引条目。
- INCLUDE NULL KEYS
- 指定当每个关键列包含NULL值时创建索引条目。
INCLUDE NULL KEYS 是默认值。
- EXCLUDE NULL KEYS
- 指定当每个关键列包含 NULL 值时,将不创建索引条目。 如果任何关键列不为空,则将创建索引条目。排除空键 不能与以下内容一起指定:
- UNIQUE
- BUSINESS_TIME WITHOUT OVERLAPS
- XML索引规范
- 关键词
- INCLUDE (列名 )
如果任何以列名标识的列被定义为非空,则也不得指定排除空键。
- 按范围划分
指定PBR UTS中表索引的分区属性,或在范围分区(非UTS)表空间中的分区属性。
在以下情况下,不得指定按范围分区:
对于PBG UTS中的表索引,或任何非分区表空间中的表空间
- 扩展索引
- 对于以BUSINESS_TIME WITHOUT OVERLAPS定义的索引
- 分区整数
- 指定后面可选属性说明的分区编号。
- 使用(分区索引)
- 如果索引是分区的,则每个分区都有一个分区子句。 在PARTITION子句中,USING子句是可选的。 如果存在 USING 子句,则它适用于该分区,就像二级索引的 USING 子句适用于整个索引一样。
当分区子句中缺少 USING 规范时,分区的 USING 子句参数取决于 USING 子句是否在分区子句之前指定。
- 如果指定了 USING 子句,则它适用于每个不包含 USING 子句的 PARTITION 子句。
- 如果未指定 USING 子句,则分区将采用以下默认设置:
- 数据集由 Db2 管理。
- 使用数据库的默认存储组。
如果省略索引空间的USING子句,则数据库的默认存储组必须存在。
PRIQTY 和 SECQTY 均采用 -1 默认值。
- ERASE(删除)使用NO(否)值。
- VCAT 目录名称
- 指定一个以指定目录名称开头的用户管理数据集。 已识别的集成目录设施目录必须已经包含索引的 n 个数据集的条目,其中 n 是分区编号。
数据集是VSAM线性数据集,在集成目录工具目录中编目, 目录名称为 有关目录名称值的更多信息,请参阅 SQL中的命名约定。
多个 Db2 子系统可以与当前服务器共享集成目录设施目录。 为了避免这些子系统尝试为不同的数据集指定相同名称,请指定一个其他 Db2 子系统未使用的目录名称值。
Db2 每个分区只有一个数据集。
- STOGROUP stogroup-name
- 如果明确或默认将 USING STOGROUP 用于分区 n ,则在执行 CREATE INDEX 语句时, Db2 会使用指定存储组中的空间来定义该分区的数据集。 特权集必须包括 SYSADM 权限、SYSCTRL 权限或该存储组的 USE 权限。 用于存储组的集成目录设施目录不得包含索引的n个数据集的条目。stogroup-name 必须标识当前服务器上存在的存储组,权限集必须包含以下权限之一,除非在声明的全局临时表上创建索引,且 stogroup-name 与工作文件数据库的默认存储组匹配:
- SYSADM 权限
- SYSCTRL 权限
- 使用存储组的权限
如果从某个分区的 USING STOGROUP 子句中省略 PRIQTY、SECQTY 或 ERASE,则它们的值由下一个管理该分区的 USING STOGROUP 子句给出:要么是任何分区子句中都不存在的 USING 子句,要么是默认的 USING 子句。 Db2 每个分区只有一个数据集。
- 自由规格(分区)
对于分区索引,特定分区的 FREEPAGE 和 PCTFREE 值由以下选项中第一个适用选项给出:
- 在分区子句中给出的该分区的FREEPAGE和PCTFREE值。 在任何分区条款中,不要使用多个免费规格。
- 在自由规格中给出的值,不在任何分区条款中。
- 默认值FREEPAGE 0和PCTFREE 10。
欲了解更多信息,请参阅免费规格。
- gbpcache-specification(分区)
对于分区索引,特定分区的 GBPCACHE 值由以下选项中适用者中的第一个给出:
- 在分区子句中为该分区给出的 GBPCACHE 的值。 在任何分区条款中,不要使用多个 gbpcache-specification。
- gbpcache-specification中给出的值,不在任何PARTITION子句中。
- GBPCACHE CHANGED是默认值。
更多信息,请参阅 gbcache-specification。
- DSSIZE 整数 G
指定分区数据集的大小。 只有在索引位于具有相对页码的PBR表空间上时,才能在CREATE INDEX上指定DSSIZE。
如果索引是使用相对页码的分区的索引,则特定分区的 DSSIZE 值由以下选项中的第一个适用选项给出:
- 在分区子句中为该分区指定的 DSSIZE 值。
- DSSIZE关键字给出的值不在任何PARTITION子句中。
- 默认值从基本表空间继承。
更多信息,请参阅 DSSIZE整数G。
- 缓冲池(BUFFERPOOL )bpname
指定用于索引的缓冲池。 特权集必须包含SYSADM或SYSCTRL权限,或缓冲池的USE特权,除非在声明全局临时表上创建索引时, 且bpname 与工作文件数据库的默认索引缓冲池匹配。
- CLOSE
- 指定当索引未使用且打开的数据集数量达到限制时,数据集是否可关闭。
- 是
- 符合结束条件。 这是默认设置,除非索引位于已声明的临时表上。
- 否
- 不符合结束条件。
如果达到开放数据集的数量限制,且没有指定关闭的页面集,则将关闭指定关闭的页面集。
对于已声明的临时表的索引,无论指定的值是什么, Db2 都会使用 CLOSE NO。
- DEFER
- 指示在执行CREATE INDEX语句时是否建立索引。 无论指定了哪种选项,目录中都会添加索引及其索引空间的描述。 如果确定表为空,并指定了“延期是”,则不会建立索引,也不会将其置于重建待定状态。 有关使用DEFER的更多信息,请参阅索引名称和指南。 对于已声明的临时表或辅助表的索引,请勿指定DEFER。
- 否
- 索引已建立。 这是缺省值。
- 是
- 索引未建立。 如果表中已填满,索引将处于重建待定状态,并发出警告消息;必须使用重建索引实用程序重建索引。
DSSIZE 整数 G

FL 500 指定分区索引中每个分区的最大大小。 任何1-1024之间的整数都可以(例如,
1 G或1024 G)。 DSSIZE子句在非分区二级索引中无效。 只有在索引位于具有相对页码的表空间上时,才能在CREATE INDEX上指定DSSIZE。要指定大于 4G 的值,表空间的数据集必须与 DFSMS 数据类相关联,该数据类已指定扩展格式和扩展寻址。
如果索引是使用相对页码的分区的索引,则特定分区的 DSSIZE 值由以下选项中的第一个适用选项给出:
- 在分区子句中为该分区指定的 DSSIZE 值。
- DSSIZE关键字给出的值不在任何PARTITION子句中。
- 默认值从基本表空间继承。
整数可以与G相隔0个或更多空格。

- PIECESIZE 整数
- 指定非分区索引中每个数据集的最大可寻址性。 后面的关键字K、M或G表示以整数表示的数值单位。
- K
- 表示整数值将乘以1024,以指定最大数据集大小(以字节为单位)。 整数必须是1-268435456范围内的2的幂。
- M
- 表示整数值将乘以1048576,以指定最大数据集大小(以字节为单位)。 整数必须是1-262144范围内的2的幂。
- G
- 表示整数值将乘以1073741824,以指定最大数据集大小(以字节为单位)。 整数必须是1-256范围内的2的幂。
下表显示了数据集大小的取值范围,具体取决于表空间的大小。表 1. PIECESIZE子句的有效值 K单位 M单位 G单位 表格空间的大小属性 256K 512 K 1024 K 1 M 2048 K 2 M 4096 K 4 M 8192 K 8 M 16384 K 16兆 32768 K 32兆 65536 K 64兆 131072 K 128兆 262144 K 256兆 524288 K 512兆 1048576 K 1024 M 1 G 2097152 K 2048 M 2 G 4194304 K 4096 M 4 G 大号,D号 4 G(或更大) 8388608 K 8192 M 8 G 8号鞋码(或更大) 16777216 K 16384 M 16 G DSSIZE 16 G(或更大) 33554432 K 32768 M 32 G DSSIZE 32 G(或更大) 67108864 K 65536 M 64 G DSSIZE 64 G(或更大) 134217728 K 131072 M 128 G 磁盘空间 128 G(或更大) 268435456 K 262144 M 256 G 大小 256 G PIECESIZE对主空间和辅助空间分配没有影响,因为它只是数据集可以容纳的最大数据量的规格,而不是存储的实际分配。
如果使用ALTER INDEX语句更改PIECESIZE值,索引将进入REBUILD-pending状态。
更多信息请参阅: - COPY
- 指示是否允许索引使用COPY实用程序。 对于已声明的临时表,不要为索引指定COPY。
- 否
- 不允许在索引上使用完整图像、并行副本或恢复工具。 NO 是缺省值。
- 是
- 允许完整图像或同时复制,并允许在索引上使用恢复工具。
备注 CREATE INDEX
- 所有者特权
- 表的拥有者拥有所有表权限(请参阅 GRANT语句(表或视图权限 )),并能够将这些权限授予他人。 有关对象所有权的更多信息,请参阅授权、特权、权限、掩码和对象所有权。
- DEFER子句的影响
- 如果隐式或显式指定了 DEFER NO,则在包含已识别表的表空间由 Db2 实用程序控制时,无法执行 CREATE INDEX 语句。
如果已识别表已包含数据且索引构建未延迟,则CREATE INDEX会为其创建索引条目。 如果该表中尚不包含数据,那么 CREATE INDEX 将为索引创建描述;将数据插入表中时就会创建索引条目。
- 评估索引表达式时出错
- 在计算表达式的索引时出现的错误会在计算表达式时返回。 这种情况可能发生在SQL数据更改语句、SQL数据更改语句中的SELECT或REBUILD INDEX实用程序中。
10 / column_1例如,如果 column_1 为0时,则返回错误。 如果表不为空且包含一行值为零的记录,则在CREATE INDEX处理期间返回错误 column_1 ,否则,当插入或更新 column_1 插入或更新时,将返回错误。 - 返回字符串类型的表达式结果长度
- 如果键表达式的结果数据类型是字符串类型,且结果长度无法在绑定时计算,则长度将设置为该数据类型允许的最大长度或 Db2 可以估算的最大长度。 在这种情况下,CREATE INDEX语句可能会失败,因为总键长度可能超过索引键的限制。
例如,表达式
REPEAT('A', CEIL(1.1))的结果长度为VARCHAR(32767),表达式SUBSTR(DESCRIPTION,1,INTEGER(1.2))的结果长度为DESCRIPTION列的长度。 因此,使用这些表达式中的任何一个作为关键字的CREATE INDEX语句可能无法创建,因为总关键字长度可能超过索引关键字的限制。 - 在主键列上使用ASC或DESC
- 对于父键或外键的列,ASC或DESC的使用没有限制。 外键索引不必与相应父键索引具有相同的升序和降序属性。
- 索引的EBCDIC、ASCII和UNICODE编码方案
- 一般来说,索引的编码方案与其关联的表相同。 但是,如果EBCDIC表中的索引仅包含Unicode列,则索引的编码方案为Unicode。
- 分区索引的最大分区大小
- 分区索引的大小取决于创建相应的分区表空间时是否使用了LARGE或DSSIZE关键字,以及分区数量。
下表提供了有关在没有使用LARGE或DSSIZE关键字且分区数量为64或更少的情况下创建的表空间分区索引的信息。
表 2. 在没有使用LARGE或DSSIZE子句且NUMPARTS值小于或等于64的情况下创建的分区表空间上,分区索引的最大数量和默认大小 分区表空间(非大)的定义 分区索引的最大条目数 每个数据集的分区索引的默认大小 零件数量<=16 16 4G NUMPARTS >= 17
但
NUMPARTS <= 3232 2G NUMPARTS >= 33 64 1G 下表显示了使用LARGE或DSSIZE关键字创建的分区超过64个的表空间上的分区索引信息。
表 3. 使用LARGE或DSSIZE子句或NUMPARTS值大于64创建的分区表空间的最大条数和默认分区索引大小 分区表空间(大)的定义 分区索引的最大条目数 分区索引的默认索引片大小 以下条件中有一个或多个为真: - LARGE条款——指定条款
NUMPARTS大于64但小于256,且未指定DSSIZE子句
分区表空间中的最大分区数 4G 以下条件中有一个或多个为真: - DSSIZE子句——指定
- NUMPARTS大于或等于256
分区表空间中的最大分区数 MIN(table space DSSIZE, 2^32/
(Maximum number of partitions
in the table space) * index
page size)要计算分区索引的最大数据集大小,需要首先使用以下公式计算表空间中的最大分区数:
MIN(4096, 2^32/ (table space DSSIZE / table space page size))
在计算表空间的最大分区数后,您可以使用上述计算的分区数,通过以下公式计算分区索引的最大数据集大小:
MIN(table space DSSIZE, 2^32/
(Maximum number of partitions in the table space) * index page size)
对于定义为 COMPRESS YES 的索引, 索引页大小始终为 4096( 4KB )。
例如,假设一个表空间及其索引具有以下特征:
- DSSIZE:64 GB
- 页面大小:32 KB
- 索引页面大小:4 KB
- 最大分区数:2048
鉴于这些特性,您可以先计算表空间中分区数量的上限:
MIN(4096, 2^32/ (64GB / 32KB)) = 2048
然后,您可以使用2048的值来计算分区索引的最大数据集大小:
MIN(64 GB, 2^32/ 2048 * 4KB)
= MIN(64GB, 8GB)
= 8GB
- 非分区索引的条目数和最大条目大小
- 索引可以容纳的最大数据量为索引的最大条目数乘以一个条目可以容纳的最大数据量。
对于非分区索引,索引可以容纳的最大数据量由PIECESIZE参数定义。
索引的默认片长如下:
- 2 GB(每块2 G),用于创建未使用LARGE或DSSIZE选项的表空间索引
- 4 GB(每块4 G),用于使用LARGE或DSSIZE选项创建的表空间索引
- 4 GB(每件4 G)用于辅助索引
下表列出了各种表格的最大行数和默认索引行大小。
表 4. 在没有LARGE或DSSIZE子句的情况下创建的分区表空间的最大数量和默认索引块大小,且NUMPART值小于或等于64 分区表空间(非大)的定义,NUMPART值 非分区索引中的最大条目数 非分区索引的默认索引片大小 零件数量<=16 32 2G NUMPARTS >= 17
但
NUMPARTS <= 3232 2G NUMPARTS >= 33 32 2G 表5。 使用LARGE或DSSIZE子句创建的分区表空间的最大条数和默认索引条大小,或者NUMPARTS值大于或等于65 分区表空间(大)的定义 非分区索引的最大条目数 非分区索引的默认索引片大小 - LARGE条款——指定条款
- DSSIZE子句——未指定
4G - LARGE条款——未指定
- DSSIZE子句——未指定
- NUMPARTS子句——大于64但小于256
4G - LARGE条款——未指定
- DSSIZE子句——指定或 NUMPARTS子句——大于或等于256
4G 注:- 对于非分区索引,公式
MIN(4096, 2^32 / (x / y))确定非分区索引的最大条目数,其中 x 和 y 具有以下值:- x 是索引的零件尺寸(存储在 SYSIBM.SYSINDEXES 目录表的PIECESIZE列中)
- y 是索引的页面大小(存储在 SYSIBM.SYSINDEXES 目录表的PGSIZE列中)
表6。 非分区表空间的最大条数和默认索引条大小 非分区表空间类型 最大数量 默认索引片大小 非分割表空间 32 2G 分段表空间 32 2G LOB、辅助或XML表空间 32 4G - 为PIECESIZE选择一个值
- 要选择PIECESIZE的值,请将非分区索引的大小除以所需的数据集数量。 例如,为了确保非分区索引有五个数据集,且索引为 10MB (且不太可能增长),请指定PIECESIZE 2 M。 如果您的非分区索引可能会增长,请选择一个更大的值。
请记住,如果基础表空间未定义为LARGE或未使用DSSIZE参数,则数据集数量上限为32;对于包含超过254个部件的对象,上限为4096。 对于定义为LARGE或带有DSSIZE参数的表空间上的非分区索引,最大值为MIN(4096, 232 / (索引块大小 / 索引页面大小 ))。
在为主要和次要数量选择数值时,请记住PIECESIZE值。 理想情况下,主要数量加上次要数量的总和应该能被PIECESIZE整除。
- 删除索引
分区索引可以删除。
非辅助表索引的二级索引只需删除索引即可。 辅助表上的空索引可以明确删除;已填充的索引只能通过删除其他对象来删除。 详情请参阅 “在辅助表上创建索引”和“辅助表 ”。
如果索引是唯一索引,且强制执行主键、唯一键或参照约束,则必须先删除约束,再删除索引。 参见 DROP语句。
如果表空间使用索引控制的分区(已弃用),则表空间将转换为表控制的分区。 更多信息,请参阅 “转换表空间以使用表控分区 ”。
- 唯一索引以及对表中UNIQUE或PRIMARY KEY规范的强制执行
- 如果在CREATE或ALTER TABLE语句中使用UNIQUE或PRIMARY KEY子句,或者存在定义为GENERATED BY DEFAULT的ROWID列,则表需要一个唯一的索引(未定义为UNIQUE WHERE NOT NULL)。 Db2 如果表空间是显式创建的,并且CREATE或ALTER TABLE语句是由模式处理器处理的,或者表空间是隐式创建的,则隐式创建这些唯一索引;否则,必须显式创建它们。 如果必须明确定义的任何唯一索引不存在,则表定义不完整,并适用以下规则:
- 设K表示一个所需唯一索引不存在的键, 设n 表示在定义表完成之前尚待创建的唯一索引的数量。 (对于没有索引的新表,K是其主键,或CREATE或ALTER TABLE语句中定义为UNIQUE的任何键, n 是此类键的数量。 在定义表完成后,如果索引强制使用主键或唯一键,则不能删除该索引。)
- 如果索引键与K相同,则创建唯一索引会将 n 减少1。 只有当键具有相同的列且顺序相同时,它们才是相同的。
- 如果 n 现在是零,索引的创建就完成了表的定义。
- 如果K是主键,则索引描述表明它是主索引。 如果K不是主键,则索引描述表明它强制执行在CREATE或ALTER TABLE语句中定义为UNIQUE的键的唯一性。
在实体化查询表上无法创建唯一索引。
- 唯一索引和XML列
- 如果索引是唯一XML列上的XML索引,则唯一性适用于该列所有文档中指定模式的值,并且唯一性在值转换为指定的SQL数据类型后生效。 由于数据类型转换可能会导致精度和规范化损失,因此,在XML文档中看似唯一的多个值仍可能会导致重复错误。 如果索引是使用表达式定义的,则唯一性是针对存储在索引中的值,而不是针对列的原始值。 如果同时指定了 XMLPATTERN,则忽略该 WHERE NOT NULL 如果同时指定了XMLPATTERN,则忽略该规格,并警告该索引被视为 UNIQUE 已指定。
- 使用包含函数的XPath模式表达式定义XML索引
- 包含函数(包括fn:exists()或fn:upper-case()) 的XPath模式表达式将包含两部分。 第一部分称为上下文步骤 ,用于指定将为其创建索引条目的元素节点或属性节点的XPath(元素或属性 NodeID 将包含在索引中)。 上下文步骤的语法与XML索引的XPath模式表达式相同,但fn:exists()必须指定一个元素节点,而fn:upper-case()必须指定一个元素节点或属性节点。
第二部分称为函数表达式步骤 ,用于指定fn:exists()或fn:upper-case() XPath函数。 函数表达式步骤是 XPath模式表达式中最右侧的部分。 对于上下文步骤指定的每个节点,函数表达式步骤为索引指定键值。 例如,在XPath 模式表达式
/purchaseOrder/items/item/fn:exists(shipDate)中,上下文步骤为/purchaseOrder/items/item,函数表达式步骤为fn:exists(shipDate)。 - PARTITIONED 关键字的使用
- 当创建分区索引且未指定其他关键字时,索引为非分区索引。 如果指定了关键词“分区”,则索引将被分区。 如果指定了“按范围分区”,则索引既是数据分区又是键分区,因为索引是在表的分区列上定义的。 分区表空间中不符合分区索引定义的任何索引都是二级索引。 当创建二级索引且未指定其他关键字时,该二级索引为非分区索引(NPSI)。 如果指定了关键词“分区”,则索引是数据分区二级索引(DPSI)。
- 为未设置分区边界的表创建分区索引
- 如果创建表时未使用 ENDING AT 子句指定分区边界,则该表在创建分区索引之前是不完整的。 为表创建的第一个索引必须同时指定PARTITION和ENDING AT子句。
在创建索引时指定分区子句时,必须同时指定分区子句或结束于子句。
- 涉及克隆关系的表的注意事项
- 如果在涉及克隆关系的基表上创建索引,则也会在克隆表上创建同名索引。 除非在创建索引时克隆表为空,否则克隆表上的索引将处于重建中状态。
- 包含行变更时间戳列的表的注意事项
- 为了创建一个索引,该索引引用表中行更改时间戳列,则该列中必须已经存在所有行的值。 每当在表中插入或更新一行时,值就会存储在行更改时间戳列中。 如果将行变更时间戳列添加到包含行的现有表中,则在执行ALTER TABLE语句时,行变更时间戳列的值不会具体化并存储。 当这些行被更新,或者当在表或表空间上运行REORG或LOAD REPLACE实用程序时,这些行的值就会实现。
- 当表空间定义存在待处理更改时,对其实施限制
- 如果表空间或表空间中任何对象的定义有未完成的更改,则不允许使用CREATE INDEX语句。 此外,在LOB列的内联长度已更改且表空间未重新组织的情况下,无法在表上创建引用表达式的索引。
- DEFINE NO和INCLUDE NULL KEYS或EXCLUDE NULL KEYS的影响
- 当(以隐式或显式方式)将“包含空键”与“定义否”一起指定,且正在索引的表已填充时,系统会返回一条警告,创建索引并定义数据集。 当指定了 EXCLUDE NULL KEYS 时,如果正在索引的表的所有行在所有关键列中包含 NULL 值,则可能无法定义数据集。 CREATE INDEX语句执行后,索引将为空。 但是,如果指定了“定义无”,并带有“排除空键”,则会返回警告。
- 在 Db2 目录表上创建索引
有关在目录表上创建索引的详细信息,请参阅目录上允许的SQL语句。
- 启用EA的索引数据集:
- 如果为启用EA的表空间创建索引,则必须将索引的数据集设置为属于具有扩展格式和扩展可寻址属性的 DFSMS 数据类。
- 其他语法和同义词:
- 为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 在创建分区索引时支持以下关键字:
- PART 整数 VALUES 是 PARTITION 整数 ENDING 的另一种写法。 分隔符前部的关键词是可选的。 PARTITION BY RANGE 分隔符前面的关键词是可选的。
虽然这些关键词可以作为备选方案,但它们并不是首选语法。
带填充和不带填充的索引

您可以通过指定NOT PADDED选项,选择不在索引中将可变长度字符串列填充至其最大长度,或者选择进行填充。 填充索引在某些情况下可能阻止仅通过索引访问数据,而非填充索引虽具有若干优势,但也存在某些弊端。 有关更多信息, 请参阅带填充或不带填充的索引。
PADIX 子系统参数控制默认情况下是否对可变长度列进行填充。 有关更多信息,请参阅默认PAD索引字段(PADIX子系统参数)。

- 目录表上的用户自定义索引
- 如果您为目录表上的索引发出CREATE INDEX命令,并指定了USING子句, Db2 将忽略该子句。 Db2 负责定义和管理索引数据集。 数据集是在与目录数据集相同的SMS环境中定义的,并带有默认空间属性。
时间参照约束
时间引用约束的外键需要索引。 索引必须通过以下方式之一定义:- 在列和关键字表达式后指定BUSINESS_TIME WITH OVERLAPS子句。
- 指定BUSINESS_TIME期间的结束列,后跟BUSINESS_TIME期间的开始列作为索引的最后两个键。 这些列都必须使用ASC。
当为表定义时间参照约束时,创建的第一个索引如果满足外键索引的条件,则记录为约束的依赖项。 用于时间参照约束的外键的索引不能删除。 不能在用于时间参照约束的索引中添加列。

例子 CREATE INDEX
在表 DSN8C10. DEPT 上创建一个名为 DSN8C10.XDEPT1 的唯一索引。 索引条目应按单列 DEPTNO 升序排列。 Db2 是为索引定义数据集,使用存储组 DSN8G120。 每个数据集最多可容纳1兆字节的数据。 将512 KB作为每个数据集的主空间分配,将64 KB作为次空间分配。 这些规格使每个数据集最多可扩展8倍,然后才会生成新的数据集。 used—512KB + ( 8*64KB )= 1024KB。 使索引丰满。
CREATE UNIQUE INDEX DSN8C10.XDEPT1 ON DSN8C10.DEPT (DEPTNO ASC) PADDED USING STOGROUP DSN8G120 PRIQTY 512 SECQTY 64 ERASE NO BUFFERPOOL BP1 CLOSE YES PIECESIZE 1 M;当没有人使用索引时,数据集可以关闭,如果删除索引,则无需删除数据集。
对于上述示例,将立即创建索引的基础数据集,这是默认设置(DEFINE YES)。 假设表 DSN8C10. DEPT 为空,如果您想推迟数据集的创建,直到数据首次插入索引,则可以指定 DEFINE NO,而不是接受默认行为。 指定“填充”可确保索引中不同长度的字符串列用空格填充。
- 在表 DSN8C10. DEPT 上创建一个名为 DSN8C10.XDEPT1 的二级索引。 按部门编号(DEPTNO)将条目升序排列。 假设用户以目录名称DSNCAT管理数据集,每个数据集最多保存 1GB 的数据,然后使用下一个数据集。
CREATE UNIQUE INDEX DSN8C10.XDEPT1 ON DSN8C10.DEPT (DEPTNO ASC) USING VCAT DSNCAT PIECESIZE 1048576 K; - 假设在示例员工表中添加了一个名为 EMP_PHOTO 的列,数据类型为 BLOB( 110K ),用于存储每位员工的照片,并在 LOB 表空间 DSN8D12A.PHOTOLTS 中创建了辅助表 EMP_PHOTO_ATAB,用于存储该列的 BLOB 数据。 在辅助表上创建一个名为XPHOTO的索引。 数据集由用户管理,目录名称为DSNCAT。
CREATE UNIQUE INDEX DSN8C10.XPHOTO ON DSN8C10.EMP_PHOTO_ATAB USING VCAT DSNCAT COPY YES;在这个例子中,没有为键指定列,因为辅助索引已经隐式地生成了键。

索引控制数据分区的语法和描述(已弃用)
对于分区(非UTS)表空间, Db2 支持表控制分区和索引控制分区。 与索引控制分区相比, 表格控制分区提供了更多的选项和灵活性。 索引控制的分区需要分区索引来控制分区。
非UTS表空间用于基础表已弃用,未来可能不再受支持。
为防止创建任何使用索引控制分区的新表,请将PREVENT_NEW_IXCTRL_PART子系统参数设置为默认值YES。 更多信息,请参阅 宏 DSN6SPRM 中的PREVENT_NEW_IXCTRL_PART
- PARTITION BY RANGE
- 指定表的分区索引,该索引决定表中数据的分区方案。
仅当表空间已分区且分区方案尚未建立时,才应指定“按范围分区”。
如果索引是扩展索引, 使用BUSINESS_TIME WITHOUT OVERLAPS定义 ,或者表位于UTS或非分区表空间中,则不能指定按范围分区。
- 分区结束 (已弃用)
- 指定每个分区的范围。
- 分区整数
- 分区(PARTITION)子句指定分区索引中一个分区中索引键的最高值。 在此语境中,最高是指索引列排序中的最高值。 在定义为升序 (ASC)的列中,最高和最低具有其通常的含义。 在定义为降序 (DESC)的列中,实际值最低的排序最高。
如果使用CLUSTER,并且表包含在分区表空间中,则必须为每个分区使用一个PARTITION子句(在CREATE TABLESPACE中使用NUMPARTS定义)。 如果有 p个分区, 整数取值范围必须为1到 p。
分区(也称为限制键)的最大值长度与分区索引的长度相同。
- 以(常数、最大值或最小值……)结尾
- 指定这是分区索引,并指示数据的分区方式。 创建分区索引后,表格空间即标记为已完成。 在每个分区子句中,必须在 ENDING AT 后面至少使用一个值 (常量、MAXVALUE 或 MINVALUE)。 您可以使用与按键列数相同的字符。 除非在创建表或前一个索引时已经指定了 VALUES 语句,否则所有值的串联是索引相应分区中键的最高值。
- constant
- 指定一个数据类型的常量值,该数据类型必须符合将该值分配给列的规则。 如果字符串常量比其列的长度属性要求的长或短,则该常量要么被截断,要么在右边填充到所需的长度。 如果列是升序的,填充字符是 X'FF'。 如果列是降序的,填充字符为 X'00'。 十进制常数的精度和精度等级不得超过其对应列的精度和精度等级。 不能指定十六进制字符串常量(GX)。
- MAXVALUE
- 指定一个大于分区边界限制键最大值的值(即所有 X'FF' ,无论列是升序还是降序)。 如果分区键中的所有列都是递增的,则不能在MAXVALUE后面指定常量或MINVALUE子句。 指定了MAXVALUE后,所有后续列都必须为MAXVALUE。
- MINVALUE
- 指定一个小于分区边界限制键最小值的值(即,所有 X'00' ,无论列是升序还是降序)。 如果分区键中的所有列都是降序排列,则不能在MAXVALUE后面指定常量或MAXVALUE子句。 指定MINVALUE后,所有后续列都必须为MINVALUE。
关键价值受以下规则约束:
- 第一个值对应于密钥的第一列,第二个值对应于第二列,以此类推。 使用比键中列数更少的值与使用省略列的最高值或最低值的效果相同,具体取决于省略列是升序还是降序。
- 如果一个键包含一个 ROWID 列或一个基于 ROWID 数据类型的不同类型的列,则要考虑为相应的 ROWID 列指定的常量的 17 个字节。
- 任何分区中键的最大值必须小于下一个分区中键的最大值。
- 如果所有值的连接超过255字节,则仅考虑前255字节。
- 最后一个分区中密钥的最高值取决于表空间的定义方式。 对于未使用LARGE或DSSIZE选项创建的表格空间,VALUES后面的指定值不会被强制执行。 表中可放置的钥匙的最高数值即为该钥匙的最大可能数值。
对于大型分区表空间,您指定的值将被强制执行。 最后一个分区指定的值是表中可放置的键的最高值。 任何大于最后一个分区指定值的键值都是超出范围的。
只有在基础表的先前CREATE或ALTER TABLE语句中未指定ENDING AT子句时,才能指定ENDING AT。
- INCLUSIVE
- 指定数据分区中包含指定的范围值。
索引控制分区示例(已弃用)
在数据库中创建一个名为 XEMP2 的集群索引,表名为EMP DSN8C10。 按EMPNO列将条目升序排列。 让 Db2 使用存储组 DSN8G120。 将主空间分配设置为36 KB,并允许 Db2 使用SECQTY的默认值,在本例中为12 KB(3倍于 4KB )。 如果索引被删除,数据集无需被删除。
共有4个分区,索引条目分配如下:
将索引与缓冲池 BP1 关联,并在无人使用索引时关闭数据集。 启用COPY实用程序以进行完整图像或并行复制,以及RECOVER实用程序。CREATE INDEX DSN8C10.XEMP2 ON DSN8C10.EMP (EMPNO ASC) USING STOGROUP DSN8G120 PRIQTY 36 ERASE NO CLUSTER PARTITION BY RANGE (PARTITION 1 ENDING AT('H99'), PARTITION 2 ENDING AT('P99'), PARTITION 3 ENDING AT('Z99'), PARTITION 4 ENDING AT('999')) BUFFERPOOL BP1 CLOSE YES COPY YES;

