更新时间:2025-07-08 GMT+08:00
分享

ALTER INDEX

功能描述

ALTER INDEX用于修改索引的定义。

注意事项

只有索引的所有者有权限执行此命令,系统管理员默认拥有此权限。

语法格式

  • 重命名表索引的名称,支持新的索引名称前带有原索引所在的schema名,但是不支持同时修改schema名。
    1
    2
    3
    4
    ALTER INDEX [ IF EXISTS ] index_name 
        RENAME TO new_name;
    ALTER INDEX [ IF EXISTS ] index_name 
        RENAME TO schema.new_name;
    
  • 修改表索引的存储参数。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        SET ( {storage_parameter = value} [, ... ] );
    
  • 修改索引的状态标记。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        SET ( {invisible = value} [, ... ] );
    
  • 重置表索引的存储参数。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        RESET ( storage_parameter [, ... ] ) ;
    
  • 设置表索引或索引分区不可用。列存表不支持该语法
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        [ MODIFY PARTITION index_partition_name ] UNUSABLE;
    
  • 重建表索引或索引分区。
    1
    2
    ALTER INDEX index_name 
        REBUILD [ PARTITION index_partition_name ] [WITHOUT UNUSABLE];
    
  • 重命名索引分区。PG_OBJECT系统表记录索引的最后修改时间时,暂不支持对该语法的记录
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        RENAME PARTITION index_partition_name TO new_index_partition_name;
    
  • 添加,修改索引的注释。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        COMMENT 'text';
    
  • 删除索引的注释。
    1
    2
    3
    4
    ALTER INDEX [ IF EXISTS ] index_name 
        COMMENT '';
    ALTER INDEX [ IF EXISTS ] index_name
        COMMENT NULL;
    

参数说明

表1 ALTER INDEX参数说明

参数

描述

取值范围

IF EXISTS

如果指定的索引不存在时,返回一个提示而不是错误。

-

RENAME TO

修改索引的名称,对存储的数据本身没有任何影响。

-

SET ( { STORAGE_PARAMETER = value } [, ...] )

修改索引的一个或多个索引方法特定的存储参数。 此命令不会立即修改索引内容,根据参数的不同,可能需要使用REINDEX重建索引来获得所需的效果。

取值范围和详细用法参见表2

RESET ( { storage_parameter } [, ...] )

重置索引的一个或多个索引方法特定的存储参数为默认值。与SET一样,可能需要使用REINDEX来完全更新索引。

-

[ MODIFY PARTITION index_partition_name ] UNUSABLE

用于设置表或者索引分区上的索引不可用。

-

REBUILD [ PARTITION index_partition_name ]

用于重建表或者索引分区上的索引。

-

WITHOUT UNUSABLE

重建表或者索引分区上的索引时不重建状态为UNUSABLE的索引。

-

RENAME PARTITION

用于重命名索引分区。

-

COMMENT comment_text

用于添加,修改或删除索引的注释。

-

index_name

需要修改的索引名。

已存在的索引名。

new_name

新的索引名。

字符串,需符合标识符命名规范

storage_parameter

索引方法特定的参数名。

-

invisible

控制优化器是否生成索引扫描相关计划。默认值:OFF。

ON或OFF。

  • ON表示不生成索引扫描相关计划。
  • OFF表示生成索引扫描相关计划。

value

索引方法特定的存储参数的新值。根据参数的不同,这可能是一个数字或单词。

-

new_index_partition_name

新索引分区名。

字符串,需符合标识符命名规范

index_partition_name

索引分区名。

字符串,需符合标识符命名规范

comment_text

索引的注释信息。

-

表2 WITH ( {storage_parameter = value} [, ... ] )指定索引方法的存储参数

存储参数

描述

示例

FILLFACTOR

GIN和PSORT索引不支持该参数,表示一个索引的填充因子(fillfactor),取值范围是一个介于10和100之间的百分比值,用于指定索引页初始填充的百分比,剩余的空间可以用于后续的插入和更新操作,从而减少页面分裂和提高性能。

该参数的作用是控制索引页的填充程度,从而影响数据库的性能和存储空间的利用效率,通过调整FILLFACTOR的值,可以减少后续更新或插入操作导致的页分裂,优化索引的存储和性能。

FILLFACTOR对索引性能的影响

  • 性能:当索引页填满后,新的数据插入会导致页面分裂,这会消耗更多的I/O资源和时间。较低的 fillfactor可以减少页面分裂,提高插入和更新性能,但会增加存储空间的使用。较高的 fillfactor可以提高存储空间的利用率,但可能会导致更多的页面分裂,降低插入和更新性能。
  • 存储空间:较低的fillfactor会增加每个数据页面的空闲空间,导致更多的磁盘空间使用。较高的fillfactor会更紧凑地存储数据,减少磁盘空间使用。

如何选择合适的FILLFACTOR值

  • 对于更新频繁的表,选择较小fillfactor值如60~80,预留空间,减少页分裂。
  • 对于更新较少的表,选择较大fillfactor值如90~100,以提高存储空间利用率。

修改索引的填充因子FILLFACTOR为60%。

1
ALTER INDEX tpcds.ds_ship_mode_t1_index7 SET (FILLFACTOR = 60);

INVISIBLE

控制优化器是否生成索引扫描相关计划。

适用场景:维护期间临时禁用索引,或测试索引对性能的影响。

取值范围

  • ON表示不生成索引扫描相关计划。
  • OFF表示生成索引扫描相关计划。

默认值:OFF

设置优化器不生成索引的扫描相关计划。

1
ALTER INDEX tpcds.ds_ship_mode_t1_index9 SET (INVISIBLE = ON);

FASTUPDATE

仅GIN索引支持该参数,GIN索引是否使用快速更新,当启用后,数据变更会暂存到待处理列表(Pending List)。

取值范围:ON,OFF

默认值:ON

打开快速更新参数FASTUPDATE,设置该索引Pending List容量的最大值为8MB。

1
ALTER INDEX tpcds.ds_ship_mode_t1_index10 SET (FASTUPDATE = ON, GIN_PENDING_LIST_LIMIT = 8192);

GIN_PENDING_LIST_LIMIT

仅GIN索引支持该参数,当GIN索引启用fastupdate时,设置该索引Pending List容量的最大值。

Pending List是GIN索引特有的数据结构,用于临时存储索引更新操作。当GIN索引启用FASTUPDATE参数时,新的索引项不会直接写入主索引结构,而是先存入Pending List,待满足特定条件时再批量合并到主索引中。

取值范围:64~INT_MAX,单位KB。

默认值:由GUC参数gin_pending_list_limit的值决定(默认为4MB)。

示例

创建示例表tpcds.ship_mode_t1。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
DROP TABLE IF EXISTS tpcds.ship_mode_t1;
CREATE TABLE tpcds.ship_mode_t1
(
    SM_SHIP_MODE_SK           INTEGER               NOT NULL,
    SM_SHIP_MODE_ID           CHAR(16)              NOT NULL,
    SM_TYPE                   CHAR(30)                      ,
    SM_CODE                   CHAR(10)                      ,
    SM_CARRIER                CHAR(20)                      ,
    SM_CONTRACT               CHAR(20)
) 
DISTRIBUTE BY HASH(SM_SHIP_MODE_SK);

在表tpcds.ship_mode_t1上的SM_SHIP_MODE_SK字段上创建唯一索引。

1
2
DROP INDEX IF EXISTS ds_ship_mode_t1_index1;
CREATE UNIQUE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK);

在表tpcds.ship_mode_t1上SM_CODE字段上创建表达式索引。

1
2
DROP INDEX IF EXISTS ds_ship_mode_t1_index2;
CREATE INDEX ds_ship_mode_t1_index2 ON tpcds.ship_mode_t1(SUBSTR(SM_CODE,1 ,4));

重命名现有的索引ds_ship_mode_t1_index1为ds_ship_mode_t1_index5。

1
ALTER INDEX tpcds.ds_ship_mode_t1_index1 RENAME TO ds_ship_mode_t1_index5;

设置索引ds_ship_mode_t1_index2不可用。

1
ALTER INDEX tpcds.ds_ship_mode_t1_index2 UNUSABLE;

重建索引ds_ship_mode_t1_index2。

1
ALTER INDEX tpcds.ds_ship_mode_t1_index2 REBUILD;

相关链接

CREATE INDEXDROP INDEXREINDEX

相关文档