ALTER INDEX 语句
ALTER INDEX 语句用于更改当前服务器上索引的描述。
调用 ALTER INDEX
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
授权 ALTER INDEX
以下定义的特权套装必须包括以下内容之一:
- 指数的所有权
- 拥有定义索引的表格
- DBADM 包含表格的数据库权限
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
FL 500安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
如果数据库是隐式创建的,则数据库权限必须位于隐式数据库或 DSNDB04 上。
如果 BUFFERPOOL 或 USING STOGROUP ,则可能需要额外的权限,具体说明见条款描述。
权限设置:
如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。 如果语句是动态准备的,则权限集是进程的每个授权ID和角色所拥有的权限集的并集。
语法 ALTER INDEX
- 1 在索引名称后必须至少指定一个条款。 它可以从可选列表中选择,也可以是 ALTER PARTITION。
- 2 如果 REGENERATE ,则它必须是ALTER INDEX语句中指定的唯一子句。
- 3 如果 ADD COLUMNPADDEDNOT PADDED ,则 ADD COLUMN 必须在 PADDED 或 NOT PADDED。
- 4 同一条款不得重复出现。
- 5
ALTER PARTITITON子句只能用于分区索引,如果指定,则必须放在最后。 - 6 同一条款不得重复出现。
使用说明:
自由规格:
gbpcache-specification:
描述 ALTER INDEX
- 索引名称
- 标识要更改或重新生成的索引。 名称必须标识当前服务器上存在的一个用户创建的索引。 名称不得标识在已声明的临时表上定义的索引。
- REGENERATE
- 指定 Db2 从 Db2 目录中重新生成表示索引定义的结构。
任何现有的权力和附属机构均予以保留。 目录已更新,并添加了重新生成的索引定义。 索引被置于重建待定状态,索引统计的目录条目被删除。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
如果索引无法成功重建,则返回错误。 在这种情况下,必须删除并重新创建索引。
一般来说,REGENERATE 关键字仅用于特定情况,如例程或对象的隐式再生失败,或 Db2 维护要求对对象或例程进行再生。 有关详细信息,请参阅何时重新生成 Db2 数据库对象和例程。
USING APPLICATION COMPATIBILITY 应用兼容级
FL 500 规定对象将根据 applcompat 级别的应用程序兼容性规则重新生成。 如果ALTER语句包含任何需要更高应用程序兼容性的语法、语义或选项,则该语句将失败。如果省略了“应用程序兼容性”选项,则再生将使用适用 SYSIBM.SYSENVIRONMENT 目录表行的APPLCOMPAT值。
可以指定以下应用兼容级别值:
V12R1M5nn

与已识别的 Db2 12 功能级别的行为兼容。 例如,
V12R1M510指定与最高可用 Db2 12 功能级别兼容。 必须激活同等或更高的功能级别。
有关每个应用程序兼容性级别中可用的新功能的信息,请参阅 V12R1Mnnn 应用程序兼容性级别。
提示:
对于使用数据服务器客户端或驱动程序访问 Db2 for z/OS® 的应用程序,可能需要额外的程序准备步骤来提高应用程序兼容性级别。 有关详细信息,请参阅为数据服务器客户端和驱动程序设置应用程序兼容性级别。

V12R1
与 Db2 12 功能 500 级的行为兼容。 该值与指定 V12R1M500的结果相同。
- V11R1
- 与 Db2 11 新功能模式的行为兼容。 迁移到 Db2 12 后,此值与指定
V12R1M100具有相同的结果。 欲了解更多信息,请访问 V11R1 应用程序兼容性级别 - V10R1
- 与 DB2® 10 新功能模式的行为兼容。 更多信息,请参阅 V10R1 应用程序兼容性级别。

- BUFFERPOOL bpname
- 标识用于索引的缓冲池。 bpname 必须标识已激活的 4K、8 KB、16 KB 或 32 KB 缓冲池,权限集必须包括 SYSADM 权限、SYSCTRL 权限或缓冲池的 USE 权限。
对于具有随机插入模式的索引,应选择较小的缓冲池。 对于顺序插入模式的索引,应选择更大容量的缓冲池。
如果索引更改为使用索引压缩( COMPRESS YES 子句),缓冲池的大小必须为8 KB、16 KB或32 KB。
根据指定此条款时的具体情况, Db2 可能会将ALTER语句视为待定的数据定义变更 ,这意味着当前对象定义和数据在语句发出时不会反映变更。 相反,更改后的对象被置于待重组(AREOR)状态,随后使用适当的实用程序对更改后的对象进行重组,从而将更改反映到目录和数据中。 更多信息,请参阅待定的数据定义变更。
如果更改是立即生效的,则索引描述的更改将在下次打开索引空间的数据集时生效。 数据集可以通过 STOP DATABASE 命令关闭并重新打开,以停止索引,然后通过 START DATABASE 命令启动索引。
如果缓冲池被更改为具有不同页面大小的缓冲池,并且更改是立即生效的,则索引将处于重建待定状态。
- CLOSE
- 指定当索引未使用且打开的数据集数量达到限制时,数据集是否可关闭。 下次打开索引空间的数据集时,更改为关闭规则将生效。
- YES
- 符合结束条件。
- NO
- 不符合结束条件。
如果达到DSMAX,且没有要关闭的CLOSE YES页面集,则将关闭CLOSE NO页面集。
- COPY
- 指示是否允许索引使用COPY实用程序。
- NO
- 不允许在索引上使用完整图像、并行副本或恢复工具。
- YES
- 允许完整图像或同时复制,并允许在索引上使用恢复工具。 为了共享数据,请 COPYYES 会导致额外的SCA(共享通信区)存储空间被使用,直到下一次完整或增量镜像复制或 COPY 被重新设置为 NO。
DSSIZE 整数 G
FL 500指定分区索引中每个分区的最大大小。 可以指定任何1-1024之间的整数(例如1 G或1024 G)。 仅当索引使用相对页码时,才能指定 DSSIZE。 此关键字不适用于非分区二级索引。在索引级别指定的 DSSIZE 值将应用于索引的每个分区。
如果索引的数据集已经创建,则不能指定小于指定分区的当前 DSSIZE 值的分区级 DSSIZE 值,也不能指定小于任何分区的当前 DSSIZE 值的索引级 DSSIZE 值。
特定分区中 DSSIZE 的值由以下选项中第一个适用选项给出:
- 在分区子句中为该分区指定的 DSSIZE 值。
- DSSIZE关键字给出的值不在任何PARTITION子句中。
- 默认值从基础表空间继承。

- PIECESIZE 整数
- 指定非分区索引中每个数据集的最大可寻址性。 子句仅适用于非分区索引。 PIECESIZE 子句仅适用于非分区索引。
请注意,当您更改PIECESIZE值时,索引将进入页面集REBUILD-pending(PSRBD)状态。 整个索引空间无法访问。 您必须运行REBUILD INDEX或REORG TABLESPACE实用程序才能删除该状态。
后面的关键词 K、 M, G表示以整数形式指定的数值单位。 整数可以与K、M或G用0个或更多空格隔开。- 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 分区表空间超过256个分区时,数据集大小限制为4096。
- 使用说明
使用规范的各个组成部分将在下文讨论,首先讨论的是非分区索引。 有关分区索引,请参阅使用规范(分区索引 )。
- USING 规格(非分区索引)
- 对于非分区索引, USING 子句指定索引的数据集是由用户管理还是由 Db2 管理。 该条款适用于可用于索引的每个数据集。 USING 条款适用于可用于索引的每个数据集。
如果您指定 USING,则在执行ALTER INDEX语句时,索引必须处于停止状态。 请参阅 “更改存储属性 ”,了解更改如何生效以及何时生效。
- VCAT 目录名称
- 指定用户管理的数据集。
数据集是VSAM线性数据集,在集成目录工具目录中编目, 目录名称为 有关目录名称值的更多信息,请参阅 SQL中的命名约定。
多个 Db2 子系统可以与当前服务器共享集成目录设施目录。 为了避免这些子系统尝试为不同的数据集指定相同名称,请指定一个其他 Db2 子系统未使用的目录名称值。
- STOGROUP stogroup-name
- 指定使用 Db2 管理的数据集,该数据集位于指定的存储组中。 stogroup-name 必须标识当前服务器上存在的存储组,权限集必须包括 SYSADM 权限、SYSCTRL 权限或存储组的 USE 权限。 当索引的新描述被应用时,存储组的描述必须至少包含一个卷序列号。 每个卷的序列号必须标识一个卷,以便 z/OS 动态分配数据集,且所有标识的卷必须属于同一设备类型。 此外,用于存储组的集成目录设施目录不得包含数据集的条目。
如果您指定了 USING STOGROUP 且当前数据集由 Db2 管理,则省略 PRIQTY, SECQTY或 ERASE 子句是省略子句当前值的隐式说明。
如果您指定 USING STOGROUP 将用户管理的数据集转换为 Db2 管理的数据集:
- 省略 PRIQTY 条款是默认值的隐含说明。 有关 Db2 如何确定默认值的信息,请参阅主要和次要空间分配规则。
- 省略 SECQTY 条款是默认值的隐含说明。 有关 Db2 如何确定默认值的信息,请参阅主要和次要空间分配规则。
- 省略 ERASE 条款的省略是对 ERASE NO。
- PRIQTY 整数
- 指定由 Db2 管理的数据集的最小主空间分配。 integer 必须是正整数,或者 -1。 仅当数据集当前由 Db2 管理且未指定使用VCAT时,才能指定此条款。当您指定PRIQTY为正整数时,主空间分配至少为 n千字节 ,其中 n 为:
- 12
- 如果整数小于12
- integer
- 如果整数在12-4194304范围内
- 2097152
- 如果以下两个条件都成立:
- 整数大于2097152。
- 该索引是一个非分区索引,位于未定义LARGE或DSSIZE属性的表空间上。
- 4194304
- 如果整数大于4194304
如果您指定了值 -1 的PRIQTY,则 Db2 将使用默认值进行主空间分配。 有关 Db2 如何确定主空间分配的默认值的信息,请参阅主空间和辅空间分配规则。
如果指定了,则 USING STOGROUP 被指定而 PRIQTY ,则 PRIQTY 是当前值。 (但是,如果当前数据集从用户管理更改为 Db2 管理,则该值为其默认值。 查看描述 USING STOGROUP
如果您指定了 PRIQTY 且未指定值 -1 ,则 Db2 将使用 4 KB 的最小倍数(不小于 n) 指定访问方法服务的主要空间分配,其中 n 的定义与 PRIQTY 描述中的定义相同。 分配的空间可能大于 Db2 所申请的空间。 例如,它可能是满足所需空间的最少轨道数。 要更精确地估计实际存储量,请参阅 DEFINE CLUSTER 命令。
在确定一个合适的值时, PRIQTY时,请注意, Db2 可能会将主要空间中的两页用于存储索引条目以外的其他用途。
- SECQTY 整数
- 指定由 Db2 管理的数据集的最小辅助空间分配。 整数必须为正整数、0或 -1。 仅当数据集当前由 Db2 管理且 USING VCAT 未指定。
如果您指定SECQTY的值为 -1 ,则 Db2 将使用默认值进行辅助空间分配。
如果指定了 USING STOGROUP,但 SECQTY ,则 SECQTY 是当前值。 (但是,如果当前数据集从用户管理更改为 Db2 管理,则该值为其默认值。 查看描述 USING STOGROUP
有关用于辅助空间分配的实际值的信息,无论您指定了值还是 Db2 使用了默认值,请参阅主空间和辅助空间分配规则。
如果您指定了 SECQTY,且未指定值 -1 ,则 Db2 将使用 4 KB 的最小倍数(不小于整数 )指定访问方法服务的辅助空间分配。 分配的空间可能大于 Db2 所申请的空间。 例如,它可能是满足所需空间的最少轨道数。 要更精确地估计实际存储量,请参阅 DEFINE CLUSTER 命令。
- ERASE
- 指示在执行删除索引的实用程序或SQL语句时,是否删除由 Db2 管理的数据集。
- NO
- 不会删除数据集。 涉及数据集删除的操作将比 ERASE YES。 不过,数据仍然可以访问,但不是通过 Db2。
- YES
- 删除数据集。 作为安全措施, Db2 在删除数据集中的所有数据前,会用0覆盖这些数据。
仅当数据集当前由 Db2 管理且 USING VCAT 未指定。 如果您指定 ERASE,则在执行ALTER INDEX语句时,索引必须处于停止状态。 请参阅 “更改存储属性 ”,了解更改如何生效以及何时生效。
- USING 规格(分区索引)
使用规范可以在全局级别或分区级别指定。 条款之前指定的使用规范适用于每个分区,但以下分区除外: PARTITION 条款的分区都适用,但带有 PARTITION 使用说明的条款。
- VCAT 目录名称
- 指定一个以指定目录名称开头的用户管理数据集。 您必须以SQL标识符的形式指定目录名称。 因此,如果集成目录工具目录的名称超过八个字符,您必须指定一个别名。
如果 n 是分区的编号,则已识别的集成目录设施目录必须包含索引的第 v 个数据集的条目,该条目符合 SQL 命名约定中描述的数据集的 Db2 命名约定。
一个或多个 Db2 子系统可以与当前服务器共享集成目录设施目录。 为了避免其中一个子系统尝试为不同的数据集分配相同的名称,请为目录名称选择一个其他 Db2 子系统未使用的值。
Db2 每个分区只有一个数据集。
- STOGROUP stogroup-name
- 如果使用 USING STOGROUP ,stogroup-name 必须标识当前服务器上存在的存储组,权限集必须包括SYSADM权限、SYSCTRL权限或存储组的USE权限。
Db2 每个分区只有一个数据集。
- 自由规格
- FREEPAGE 整数
- 指定在执行 Db2 实用程序创建索引条目时,每隔多长时间留出页面空白。 每页整数页后 ,可免费增加一页。 整数值的范围为0到255。 在通过 Db2 实用程序加载或重组索引或分区之前,更改索引或分区的描述不会产生任何影响。 不要 FREEPAGE 隐式创建的XML索引。
- PCTFREE 整数
- 当执行 Db2 实用程序时,在索引或分区中添加条目时,确定每个非叶页和叶页中要保留的可用空间百分比。 页面中的第一个条目不受限制地加载。 当非叶页或叶页中放置了其他条目时,可用空间百分比至少等于整数。
整数值的范围是0到99,但如果指定了大于10的值,非叶子页面中仅会留出10%的可用空间。 在通过 Db2 实用程序加载或重组索引或分区之前,更改索引或分区的描述不会产生任何影响。 不要 PCTFREE 隐式创建的XML索引。
如果索引被分区,则 FREEPAGE 和 PCTFREE 由第一个适用的选项给出:
- 的价值观 FREEPAGE 和 PCTFREE 该分区条款中给出的 PARTITION 子句中给出的值。 请勿在任何 PARTITION 条款。
- 在任意条款之前的自由规格中给出的数值 PARTITION 条款之前。
- 当前值 FREEPAGE 和 PCTFREE 该分区的当前值。
- gbpcache 规范
- GBPCACHE
- 指定在数据共享环境中哪些索引页面写入组缓冲池。 在非数据共享环境中,您可以指定此选项,但会被忽略。
- CHANGED
- 当索引或分区存在相互Db2 读写关系时,更新后的页面将写入组缓冲池。 如果没有Db2 读写需求,则不会使用组缓冲池。 当数据共享组中不止一个成员打开索引或分区,且至少有一个成员将其打开进行更新时,就存在跨Db2 读写权限。
如果索引位于组缓冲池中,该组缓冲池被定义为 GBPCACHE( NOCHANGED 将被忽略,且不会将任何页面缓存到组缓冲池中。
- ALL
- 指示页面从 DASD 读取时缓存到组缓冲池,但有一个例外。 当页面集不依赖于英镑且一个 Db2 数据共享成员对该页面集具有独占的读写权限(其他组成员对该页面集没有任何权限)时,组缓冲池中不会缓存任何页面。
如果索引位于组缓冲池中,该组缓冲池被定义为 GBPCACHE( NOALL 将被忽略,且不会将任何页面缓存到组缓冲池中。
- NONE
- 表示不将任何页面缓存在组缓冲池中。 Db2 仅将组缓冲池用于交叉验证。
如果您指定 NONE,索引或分区不得处于组缓冲池恢复待定(GRECP)状态。
如果索引被分区,则特定分区的 GBPCACHE 由以下选项中第一个适用选项给出:
- 给出的 GBPCACHE 在 PARTITION 该分区条款中给出的。 不要在任何情况下使用多个 gbpcache-specification PARTITION 条款。
- 在任何 PARTITION 条款。
- 当前值 GBPCACHE 该分区的当前值。
如果您在 GBPCACHE 在数据共享环境中,当执行ALTER INDEX语句时,索引或分区必须处于停止状态。 您无法更改 Db2 目录表中某些索引的GBPCACHE值;更多信息,请参阅目录中允许的SQL语句。
- CLUSTER 或者 NOT CLUSTER
- 指定索引是否是表的聚簇索引。
- CLUSTER
- 该索引用作表的聚类索引。 此变更立即生效。 后续的插入操作将使用新的聚簇索引。 在重新组织表空间之前,现有数据仍按之前的聚类索引进行聚类。
当数据插入到使用 MEMBER CLUSTER。 Db2 不会使用集群排序,而是根据可用空间来选择数据的位置。 属性仅影响通过插入操作插入的数据;数据始终按集群顺序加载和重组。 MEMBER CLUSTER 属性仅影响通过插入操作插入的数据;数据始终按集群顺序加载和重组。
以下情况无需 CLUSTER 以下情况:- 该索引用于辅助表格。
- CLUSTER 已经被用于桌上的另一个索引。
- 索引是一个XML索引。
- 索引包括表达式。
- 该索引用于使用哈希组织的表。
- 该索引是表的哈希溢出索引。
- NOT CLUSTER
- 该索引不作为表的聚簇索引。 如果索引已定义为聚类索引,则 Db2 和REORG实用程序将继续将其用作聚类索引,直到通过为其他索引指定 CLUSTER 不同的索引。
指定 NOT CLUSTER 对于非聚簇索引的索引指定将被忽略。
如果索引是使用索引控制的分区的表的分区索引,则该表将转换为使用表控制的分区。 最后一个分区的高限键设置为升序键列的最大值或降序键列的最小值。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- COMPRESS NO 或者 COMPRESS YES
- 指定是否压缩索引数据。 如果索引被分区,则此选项将应用于所有分区。
根据指定此条款时的具体情况, Db2 可能会将ALTER语句视为待定的数据定义变更 ,这意味着当前对象定义和数据在语句发出时不会反映变更。 相反,更改后的对象被置于待重组(AREOR)状态,随后使用适当的实用程序对更改后的对象进行重组,从而将更改反映到目录和数据中。 更多信息,请参阅待定的数据定义变更。
FL 500如果是立即更改,索引描述的更改将在下一次打开索引空间的数据集时生效。 可以使用 STOP DATABASE 命令关闭和重新打开数据集,该命令用于停止索引,然后使用 START DATABASE 命令启动索引。
如果压缩属性更改为不同的值,并且是立即更改,索引将进入 REBUILD 待定状态。 
- COMPRESS NO
- 指定关闭索引压缩。
- COMPRESS YES
- 指定索引将使用索引压缩。 COMPRESS YES 仅当控制区间大小为 4K 时,才能为用户管理的数据集指定。
- NOT PADDED 或者 PADDED
- 指定如何在索引中存储长度不同的字符串列。 如果索引中不包含长度不等的列,则忽略此选项并返回警告消息。
- NOT PADDED
- 指定在索引中,不同长度的字符串列不会填充到最大长度。 可变长度列的长度信息与键一起存储。
NOT PADDED 如果索引位于辅助表上,则忽略该参数,且该参数不起作用。 辅助表中的索引总是填充的。
当 PADDED 改为 NOT PADDED时,将使用变长公式重新计算最大密钥长度(2000 - n - 2m - 3d,其中 n 是可以包含空值的列数, m 是变长列的数量, d 是密钥中 DECFLOAT 列的数量)。 如果索引密钥长度可能超过最大长度(因为在填充时使用了公式2000 - n),则会出现错误。
- PADDED
- 指定索引中长度不同的字符串列总是用默认填充字符填充到最大长度。
当至少有一个长度可变的列的索引从 PADDEDNOT PADDED ,反之亦然,索引将处于受限重建待定状态(RBDP)。 在从表中重建索引(使用REBUILD INDEX、REORG TABLESPACE或LOAD REPLACE实用程序)之前,无法访问该索引。 对于非分区二级索引(NPSI),索引处于页面集重建待定状态(PSRBD),必须重建整个索引。 此外,依赖于索引的动态缓存语句也会失效。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
不要指定 PADDED 索引是否为XML索引。
- ADD COLUMN 列名
- 将列名添加到索引中。
列名必须是未限定的,必须标识表中的列,且不能是索引中已有的列之一。
该专栏不能:
- LOB列,或基于LOB数据类型的独特类型列
- 如果还指定了分区或范围分区子句,则使用带时区的时间戳列或基于带时区的数据类型的时间戳的具有不同类型的列
- VARBINARY列或基于VARBINARY数据类型的独特类型列,如果该列定义了DESC属性,或者索引定义了PADDED属性
范围分区索引的行更改时间戳列
FL 500A 添加到索引中的字符串或图形字符串列必须与索引中的其他字符串或图形字符串列具有相同的编码方案。
该索引不能已经使用BUSINESS_TIME WITHOUT OVERLAPS规范定义。
FL 500A 时间参照约束不得依赖于索引。
索引的列总数不能超过64。
如果向使用EXCLUDE NULL KEYS子句定义的索引中添加列,则该索引将处于REBUILD-pending状态。
如果索引使用EXCLUDE NULL KEYS子句定义,则指定的列必须允许空值。
FL 500对于 PADDED 索引,列的长度属性之和不得大于 2000 - n,其中 n 是可以包含空值的列数。 FL 505对于 NOT PADDED 索引,列的长度属性之和不得大于2000 - n - 2m - 3d,其中 n 是可归零列的数量, m 是不同长度列的数量, d 是 DECFLOAT 列的数量。
该指数不能是以下任何一种类型的指数:
- 系统定义的目录索引
- 一个索引,用于加强主键、唯一键或参照约束
FL 500 一种执行时间参照约束的索引
- 当使用索引控制的分区时,分区索引
- ROWID列所需的唯一索引定义为默认生成
- 辅助索引
- XML索引
- 包含表达的索引
- 表的哈希溢出索引

如果在同一个提交范围内向表和索引添加列,索引可以处于待重组(AREO*)的咨询状态,并可以立即使用。 然而,以下情况会导致索引处于重建中(REBUILD-pending,RBDP)状态:
- 当列被添加到表和索引中时,行也会在同一提交范围内插入到表中。
- 列名指定的是ROWID列

- ASC
- 索引条目按列升序排列。
- DESC
- 索引条目按列降序排列。
- RANDOM
- 索引条目按列随机排序。 RANDOM 在以下情况下无法指定:
- 索引键中包含一个长度可变的列,索引定义为“无填充”。
FL 500A 列的索引键定义为 TIMESTAMP WITH TIME ZONE 或 DECFLOAT。
- 索引是分区密钥的一部分。
- ADD INCLUDE ( 列名 )
- 指定附加列,以附加到唯一索引的索引键列集。 任何使用 INCLUDE 列名指定的列 ,不用于确保唯一性。 对于仅使用索引访问的部分查询,包含的列可能会提高性能。
在ADD INCLUDE子句中指定的列计入列数限制和索引中指定的列长度属性总和限制。 索引的列总数不能超过64。
列名必须是未限定的,必须标识指定表的列,且不能是索引中已有的列之一。 列名不能标识LOB或DECFLOAT列(或基于这些类型之一的不同类型)。
下列索引类型不能指定包含子句:
- 系统定义的目录索引
- 非唯一索引
- 使用索引控制分区时的分区索引
- 辅助索引
- 外键索引
- XML索引
- 扩展索引
- 包含表达的索引
- 使用EXCLUDE NULL KEYS子句创建的索引
FL 500 时间参照约束所需的索引
如果在同一提交范围内,表和关联索引都添加了列,且该列不是 ROWID 列,则索引将处于待重组状态(AREO*)。 否则,索引将处于重建待定状态(RBDP)。
INCLUDE列表中定义为字符或图形字符串数据类型的列必须使用与其它字符或图形字符串数据类型的关键列相同的编码方案进行定义。
- ALTER PARTITION 整数
- 标识要更改的索引分区。 对于具有 n个分区的索引,您必须指定一个介于1 到n 之间的整数。 如果索引未分区,或者索引定义在包含XML列并使用索引控制分区的表上,则不得使用此条款。 至少应明确以下条款之一:
- USING
- 自由型
- GBCACHE
- DSSIZE
备注 ALTER INDEX
- 待定义变更:
下表列出了导致ALTER INDEX语句作为待定义更改处理的条款和特定条件,这些条款和条件在ALTER语句发出时不会反映在当前定义或数据中。 相反,该指数被置于待重组(AREOR)的咨询状态。 随后,通过适当的实用程序对整个索引进行重组,以实现更改并将待定的定义更改应用到目录和数据中。
如果表空间没有待定的定义变更,您可以运行带有 SHRLEVEL CHANGE 的 REORG INDEX 实用程序,或者带有 SHRLEVEL CHANGE 或 REFERENCE 的 REORG TABLESPACE 实用程序,以实现索引定义的变更。 如果表空间定义也有待更改,则必须使用 SHRLEVEL CHANGE 或 REFERENCE 运行 REORG TABLESPACE 实用程序,以启用对索引定义(以及待定的表空间定义)的更改。
条款或选项 如果……,则使用待定义的更改。 BUFFERPOOL 指数数据集已创建,且满足以下所有条件:
索引是在基本表或相关 XML 表或辅助表上定义的,其中基本表的表空间是通用表空间(UTS),或正在通过待定 义更改转换为通用表空间。 
缓冲池更改为不同大小的缓冲池,或缓冲池更改为相同大小的缓冲池,且表空间或表空间中的对象有待定 义更改。
COMPRESS
创建了索引的数据集,且以下所有条件均为真:- 索引在基本表、关联的XML表或辅助表上定义,其中基本表的表空间是通用表空间(UTS),或通过待定的定义更改转换为UTS。
- 压缩属性已更改,或者表空间或表空间中的对象有未完成的定义更改。

更多信息,请参阅待定的数据定义变更。
- 待定数据定义变更的限制
- 以下限制适用于ALTER TABLESPACE、ALTER TABLE和ALTER INDEX语句,这些语句会导致数据定义变更处于待处理状态:
- 导致待定更改的选项不能与立即生效的选项一起指定。
- 无法为 Db2 目录、其他系统对象或工作文件数据库中的对象指定会导致未完成更改的选项。
- 不能为目录表空间指定ALTER TABLESPACE语句中的DROP PENDING CHANGES子句。
- 如果表格空间或其中包含的任何表格处于未完成状态,则无法指定会导致待处理更改的选项。
- 对于ALTER INDEX,如果定义索引的表空间或表的定义不完整,则无法指定导致待处理更改的选项。
此外,许多变更操作会受到限制,因为表空间、表空间包含的表或表上的索引存在待定的数据定义变更。 更多信息,请参阅 “待定数据定义变更的限制 ”。
- 更改存储属性:
- USING, PRIQTYSECQTY和 ERASE 子句定义索引或分区的存储属性。 如果您指定了 USING 或 ERASE 子句来修改存储属性,则在执行ALTER INDEX语句时,索引或分区必须处于停止状态。 可以使用 STOP DATABASE…SPACENAM… 命令停止索引或分区。
如果目录名称发生更改,请在移动数据并使用 START DATABASE…SPACENAM… 命令启动索引或分区后,更改才会生效。 目录名称可以通过ALTER INDEX语句进行隐式或显式更改。 当您将数据移动到其他设备时,目录名称也会随之改变。 请参阅移动 Db2 数据集中的数据移动流程。
辅助空间分配(SECQTY)的更改将在 Db2 扩展数据集时生效;但是,在索引或分区上使用REORG、RECOVER或LOAD REPLACE实用程序之前,新值不会反映在集成目录中。 下次在索引或分区上使用REORG、RECOVER或LOAD REPLACE实用程序时,其他存储属性的更改才会生效。 如果您更改主空间分配参数或删除规则,则可以在启动索引或分区之前移动数据,使更改提前生效。
- 修改 Db2 目录表的索引:
- 有关更改目录表选项的详细信息,请参阅目录上允许的SQL语句。
- 索引对象描述符的大小限制:
- 如果ALTER INDEX语句导致添加(或更新)的版本化对象描述符超过30,000字节,则以下情况可能会导致错误:
- ALTER INDEX语句,用于为索引生成第一个版本的对象描述符
如果索引的对象描述符超过30,000字节,您可能需要删除并重新创建索引。
- 包裹失效:
- 根据指定的条款和关键字以及其他因素,此语句可能会使所有依赖于目标对象的程序包失效,有时还会通过级联效应影响其他相关对象。 更多信息,请参阅 “导致套餐失效的变更 ”。
- 更改极限键:
- 如果您指定 ALTER PARTITION 整数 ENDING AT 来更改分区索引的限值键,则依赖于该索引的包将被标记为无效,并在下次运行时自动重新绑定。
- 与ALTER INDEX在同一提交范围内对SQL数据更改语句的限制:
- 影响索引的SQL数据更改语句不能与影响该索引的ALTER INDEX语句在同一提交范围内执行。
- 更改克隆关系中涉及到的表的索引:
- 您不能更改克隆关系中涉及的任何表(基础表或克隆表)的索引。 如果需要对索引进行更改,则必须先删除克隆表,然后才能更改索引。 索引更改后,可以重新创建克隆表。
- 为默认值为“无填充”的系统添加一个长度可变的键:
- 如果系统默认值不是 PADDED(安装面板 DSNTIPE 上的字段 PAD INDEXES BY DEFAULT 的值为 NO),则索引创建时,密钥中没有可变长度的列,且未明确指定 PADDED 或 NOT PADDED 选项,则 SYSIBM.SYSINDEXES 目录表的 PADDED 列将填充为空值。 如果以后在密钥中添加了一个长度不同的列,则 SYSIBM.SYSINDEXES 中填充列的值将更改为“Y”,以表示该索引现在是一个填充索引。
- 运行实用程序:
- 当 Db2 实用程序控制索引或其关联表空间时,不能执行ALTER INDEX语句。
- 其他语法和同义词:
- 为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 在更改分区索引的分区时支持以下关键字:
- PART可以作为 PARTITION。 此外, ALTER 前面的关键词 PARTITION 是可选的。 此外,如果您修改了多个分区,则可以在每个 ALTER PARTITION 整数子句之间使用逗号是可选的。
- VALUES 可以作为 ENDING AT。
虽然这些关键词可以作为备选方案,但它们并不是首选语法。
例子 ALTER INDEX
- 示例 1
- 修改索引 DSN8C10.XEMP1。 说明当当前没有索引用户时, Db2 不会关闭支持索引的数据集。
ALTER INDEX DSN8C10.XEMP1 CLOSE NO; - 示例 2
- 修改索引 DSN8C10.XPROJ1。 使用 BP1 作为与索引关联的缓冲池,允许索引上存在完整图像或并发副本,并将每个数据集的最大大小更改为8兆字节。
ALTER INDEX DSN8C10.XPROJ1 BUFFERPOOL BP1 COPY YES PIECESIZE 8 M; - 示例 3
- 假设索引 X1 至少包含一个长度可变的列,并且是一个填充索引。 将索引更改为非填充索引。
ALTER INDEX X1 NOT PADDED;索引处于受限重建待定状态(RBDP),在从表中重建之前无法访问。
- 示例 4
- 更改分区索引 DSN8C10.DEPT1。 对于第3分区,每13页留出一页空白,每页留出13%的空白。 对于第5分区,每25页留出一页,并留出25%的空白。 对于所有其他分区,每6页留出一页空白,并留出11%的空白空间。 确保索引页缓存到除分区4以外的所有分区的组缓冲池中。 对于分区4,仅在分区存在Db2 读写兴趣时才写入页面。
ALTER INDEX DSN8C10.XDEPT1 BUFFERPOOL BP1 CLOSE YES COPY YES USING VCAT CATLGG FREEPAGE 6 PCTFREE 11 GBPCACHE ALL ALTER PARTITION 3 USING VCAT CATLGG FREEPAGE 13 PCTFREE 13, ALTER PARTITION 4 USING VCAT CATLGG GBPCACHE CHANGED, ALTER PARTITION 5 USING VCAT CATLGG FREEPAGE 25 PCTFREE 25;
索引控制数据分区的语法和描述(已弃用)
对于分区(非UTS)表空间, Db2 支持表控制分区和索引控制分区。 与索引控制分区相比, 表格控制分区提供了更多的选项和灵活性。 索引控制的分区需要分区索引来控制分区。
用于基本表的非 UTS 表空间已被淘汰,今后可能不再支持。
- ALTER PARTITION 整数
- 标识要更改的索引分区。 对于具有 n个分区的索引,您必须指定一个介于1 到n 之间的整数。 在以下情况下,您不得使用本条款:
- 如果索引是非分区的
- 如果索引定义在包含XML列的表上,并使用索引控制的分区
如果索引是分区索引,且您指定了 ENDING AT 子句。
- ENDING AT(常量 )、 MAXVALUE或 MINVALUE
- 指定分区索引中已识别分区的索引键的最大值。 在此语境中,最高是指索引列排序中的最高值。 在定义为升序(ASC)的列中,最高和最低具有通常的含义。 在定义为降序(DESC)的列中,实际值最低的排序最高。
您必须至少输入一个值 (常数、 MAXVALUE或 MINVALUEENDING AT 每个 PARTITION 子句中必须至少使用一个值(常量、或)。 您可以使用与键中列数相同的值。 所有值的串联是索引中相应分区中键的最高值。 每个最高键值(也称为极限键)的长度与分区索引的长度相同
- constant
- 指定一个数据类型的常量值,该数据类型必须符合将该值分配给列的规则。 如果字符串常量比其列的length属性要求的长或短,则该常量要么被截断,要么在右边填充到所需的长度。 如果列是升序的,填充字符是 X'FF'。 如果列是降序的,填充字符为 X'00'。 十进制常数的精度和精度等级不得超过其对应列的精度和精度等级。 不能指定十六进制字符串常量(GX)。
- MAXVALUE
- 指定一个大于分区边界限制键最大值的值(即,所有 X'FF' ,无论列是升序还是降序)。 如果分区键中的所有列都是递增的,则不能在 MINVALUE 条款不能在后面指定 MAXVALUE。 指定后,所有后续列必须为 MAXVALUE 指定后,所有后续列必须为 MAXVALUE。
- MINVALUE
- 指定一个小于分区边界限制键最小值的值(即,所有 X'00' ,无论列是升序还是降序)。 如果分区键中的所有列都是降序排列,则不能在 MAXVALUE 子句后面不能指定常数或 MAXVALUE。 指定后,所有后续列必须为 MINVALUE 指定后,所有后续列必须为 MINVALUE。
关键价值受以下规则约束:
- 第一个值对应于密钥的第一列,第二个值对应于第二列,以此类推。
- 如果一个键包含一个ROWID列(或一个基于ROWID数据类型的不同类型的列),则ROWID列的值被认为在 X'000...00'到 X'FFF...FF'. 仅考虑为对应 ROWID 列指定的值的首 17 个字节。
- 使用比索引列数更少的值与为所有省略的列使用尽可能大的值来创建升序索引的效果相同。
- 如果密钥超过255字节,则只考虑前255字节。
- 任何分区中密钥的最高值必须低于下一个分区中密钥的最高值。
- 最后一个分区中密钥的最高值取决于表空间的定义方式。 对于未使用LARGE或DSSIZE选项创建的表格空间,您在 ENDING AT 的常量不会被强制执行。 表中可放置的钥匙的最高数值即为该钥匙的最大可能数值。
对于使用LARGE或DSSIZE选项创建的表格空间,您指定的常量在 ENDING AT 之后指定的常量将被强制执行。 最后一个分区指定的值是表中可放置的键的最高值。 在执行ALTER TABLE语句后失效的任何键,在运行REORG实用程序时都会被放入废弃数据集。 如果最后一个分区处于重组待定状态,无论您是否更改了其限制键值,在运行REORG实用程序时都必须指定一个丢弃数据集。
ENDING AT 在使用表控制分区的表上定义的任何索引中,不得指定。 使用ALTER TABLE ALTER PARTITION修改使用表控制分区的表的分区边界。
- INCLUSIVE
- 指定数据分区中包含指定的范围值。
