SQL COMMAND · 索引与统计
ALTER INDEX
更改索引的定义
ALTER索引与统计引入 10(基线)现存至 20 devel2 次语法变更
- 动词
ALTER- 对象
INDEX- 分组
- 索引与统计
- 引入版本
- 10(基线)
- 状态
- 现存
- 语法变更次数
- 2
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17 无变化。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
ALTER INDEX · 语法 2
ALTER INDEX · 语法 3
ALTER INDEX · 语法 4
ALTER INDEX · 语法 5
ALTER INDEX · 语法 6
ALTER INDEX · 语法 7
ALTER INDEX · 语法 8
语法概要
ALTER INDEX [ IF EXISTS ]nameRENAME TOnew_nameALTER INDEX [ IF EXISTS ]nameSET TABLESPACEtablespace_nameALTER INDEXnameATTACH PARTITIONindex_nameALTER INDEXname[ NO ] DEPENDS ON EXTENSIONextension_nameALTER INDEX [ IF EXISTS ]nameSET (storage_parameter[=value] [, ... ] ) ALTER INDEX [ IF EXISTS ]nameRESET (storage_parameter[, ... ] ) ALTER INDEX [ IF EXISTS ]nameALTER [ COLUMN ]column_numberSET STATISTICSintegerALTER INDEX ALL IN TABLESPACEname[ OWNED BYrole_name[, ... ] ] SET TABLESPACEnew_tablespace[ NOWAIT ]
描述
ALTER INDEX更改现有索引的定义。下面描述了若干种子形式。 请注意,每种子形式所需的锁级别可能不同。除非另有明确说明,否则会持有 ACCESS EXCLUSIVE锁。若列出多个子命令,则持有的锁将是其中任一子命令所需的最严格锁。
RENAMERENAME形式更改该索引的名称。如果该索引与某个表约束(即UNIQUE、PRIMARY KEY或EXCLUDE)相关联,该约束也会一并重命名。这不会影响已存储的数据。重命名索引会获取一个
SHARE UPDATE EXCLUSIVE锁。SET TABLESPACE这种形式将该索引的表空间改为指定表空间,并把与该索引关联的数据文件移动到新表空间中。 要更改索引的表空间,你必须拥有该索引,并且对新表空间具有
CREATE权限。使用ALL IN TABLESPACE形式可以移动当前数据库中某个表空间内的全部索引;该形式会锁定所有待移动的索引,然后逐个移动。 该形式还支持OWNED BY,这时只会移动属于指定角色的索引。 如果指定了NOWAIT选项,则在命令无法立即获取所需全部锁时会失败。 注意,该命令不会移动系统目录;如果需要这样做,应改用ALTER DATABASE或显式调用ALTER INDEX。另见CREATE TABLESPACE。ATTACH PARTITIONindex_name使指定名称的索引(可以带模式限定)附加到被修改的索引上。 该索引必须位于包含被修改索引之表的某个分区上,并且具有等价定义。 已附加的索引不能单独删除;如果其父索引被删除,它也会自动被删除。
如果指定名称的索引已经附加到被修改的索引,并且父索引当前无效,该命令将尝试验证父索引。
DEPENDS ON EXTENSIONextension_nameNO DEPENDS ON EXTENSIONextension_name这种形式会将索引标记为依赖于该扩展;如果指定了
NO,则表示不再依赖该扩展。 标记为依赖于扩展的索引会在扩展被删除时自动删除。SET (storage_parameter[=value] [, ... ] )这种形式更改该索引的一个或多个索引方法相关的存储参数。可用参数的详情请见
CREATE INDEX。 请注意,此命令不会立即修改索引内容;根据参数不同,你可能需要使用REINDEX重建索引,才能获得期望的效果。RESET (storage_parameter[, ... ] )这种形式将一个或多个索引方法相关的存储参数重置为默认值。与
SET一样,可能仍需要执行一次REINDEX才能让该索引被完全更新。ALTER [ COLUMN ]column_numberSET STATISTICSinteger这种形式为后续的
ANALYZE操作设置每列的统计信息收集目标, 但只能用于定义为表达式的索引列。由于表达式没有唯一名称,我们通过索引列的顺序号来引用它们。 该目标可以设置为0到10000之间的值;或者设为-1,以恢复使用系统默认统计信息目标 (default_statistics_target)。关于 PostgreSQL查询规划器如何使用统计信息的更多信息,请参阅 Section 14.2。
参数
IF EXISTS如果该索引不存在,则不要抛出错误。这种情况下会发出一条提示。
column_number该顺序号表示该索引列从左到右的位置。
name要修改的现有索引名称(可以是模式限定的)。
new_name该索引的新名称。
tablespace_name该索引将被移动到的表空间。
extension_name该索引所依赖的扩展的名称。
storage_parameter一个索引方法相关的存储参数的名称。
value一个索引方法相关的存储参数的新值。根据具体参数,它可能是数字或一个词。
注解
这些操作同样可以使用 ALTER TABLE完成。 实际上,ALTER INDEX只是ALTER TABLE 中适用于索引的那些形式的别名。
以前曾有一种ALTER INDEX OWNER变体,但现在会被忽略 (同时发出警告)。索引的拥有者不能不同于其所属表的拥有者。更改表的拥有者时, 索引的拥有者也会自动更改。
不允许更改系统目录索引的任何部分。
示例
要重命名现有索引:
ALTER INDEX distributors RENAME TO suppliers;
要将索引移到另一个表空间:
ALTER INDEX distributors SET TABLESPACE fasttablespace;
要更改索引的填充因子(假设该索引方法支持fillfactor参数):
ALTER INDEX distributors SET (fillfactor = 75); REINDEX INDEX distributors;
要为表达式索引设置统计信息收集目标:
CREATE INDEX coord_idx ON measured (x, y, (z + t)); ALTER INDEX coord_idx ALTER COLUMN 3 SET STATISTICS 1000;
兼容性
ALTER INDEX是一种 PostgreSQL扩展。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 14← 13正文更新
正文更新PostgreSQL 13← 12语法变化
+ ALTER INDEX name [ NO ] DEPENDS ON EXTENSION extension_name− ALTER INDEX name DEPENDS ON EXTENSION extension_name正文更新PostgreSQL 12← 11正文更新
正文更新PostgreSQL 11← 10语法变化
+ ALTER INDEX name ATTACH PARTITION index_name+ ALTER INDEX [ IF EXISTS ] name ALTER [ COLUMN ] column_number+ SET STATISTICS integer正文更新
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
REINDEX | REINDEX | — | 143 次 | |
| 重建索引 | 现存 | |||
CREATE INDEX | CREATE | INDEX | 143 次 | |
| 定义一个新索引 | 现存 | |||
ALTER INDEX | ALTER | INDEX | 132 次 | |
| 更改索引的定义 | 现存 | |||
DROP INDEX | DROP | INDEX | — | |
| 移除一个索引 | 现存 | |||
CREATE STATISTICS | CREATE | STATISTICS | 192 次 | |
| 定义扩展统计信息 | 现存 | |||
ALTER STATISTICS | ALTER | STATISTICS | 142 次 | |
| 更改扩展统计对象的定义 | 现存 | |||
DROP STATISTICS | DROP | STATISTICS | — | |
| 删除扩展统计对象 | 现存 | |||