
# ALTER INDEX
#### 功能描述
ALTER INDEX用于修改索引的定义。
#### 注意事项
只有索引的所有者有权限执行此命令，系统管理员默认拥有此权限。
#### 语法格式
- 重命名表索引的名称，支持新的索引名称前带有原索引所在的schema名，但是不支持同时修改schema名。
  ```
  ALTER INDEX [ IF EXISTS ] index_name 
      RENAME TO new_name;
  ALTER INDEX [ IF EXISTS ] index_name 
      RENAME TO schema.new_name;
  ```
  

- 修改表索引的存储参数。
  ```
  ALTER INDEX [ IF EXISTS ] index_name 
      SET ( {storage_parameter = value} [, ... ] );
  ```
  

- 修改索引的状态标记。
  ```
  ALTER INDEX [ IF EXISTS ] index_name 
      SET ( {invisible = value} [, ... ] );
  ```
  

- 重置表索引的存储参数。
  ```
  ALTER INDEX [ IF EXISTS ] index_name 
      RESET ( storage_parameter [, ... ] ) ;
  ```
  

- 设置表索引或索引分区不可用。
  ```
  ALTER INDEX [ IF EXISTS ] index_name 
      [ MODIFY PARTITION index_partition_name ] UNUSABLE;
  ```
  

- 重建表索引或索引分区。
  ```
  ALTER INDEX index_name 
      REBUILD [ PARTITION index_partition_name ] [WITHOUT UNUSABLE];
  ```
  

- 重命名索引分区。[PG_OBJECT](https://support.huaweicloud.com/devg-dws/dws_04_0601.html)系统表记录索引的最后修改时间时，**暂不支持对该语法的记录** 。
  ```
  ALTER INDEX [ IF EXISTS ] index_name 
      RENAME PARTITION index_partition_name TO new_index_partition_name;
  ```
  
 
- 添加，修改索引的注释。
  ```
  ALTER INDEX [ IF EXISTS ] index_name 
      COMMENT 'text';
  ```
  
- 删除索引的注释。
  ```
  ALTER INDEX [ IF EXISTS ] index_name 
      COMMENT '';
  ALTER INDEX [ IF EXISTS ] index_name
      COMMENT NULL;
  ```
  
#### 参数说明
表1ALTER 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                                             | 新的索引名。                                                                  | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                          |
| storage_parameter                                    | 索引方法特定的参数名。                                                             | -                                                                                                                                                                                                                                                                                                                                                |
| invisible                                            | 控制优化器是否生成索引扫描相关计划。默认值：OFF。                                              | ON或OFF。 - ON表示不生成索引扫描相关计划。  - OFF表示生成索引扫描相关计划。   |
| value                                                | 索引方法特定的存储参数的新值。根据参数的不同，这可能是一个数字或单词。                                     | -                                                                                                                                                                                                                                                                                                                                                |
| new_index_partition_name                             | 新索引分区名。                                                                 | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                          |
| index_partition_name                                 | 索引分区名。                                                                  | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                          |
| comment_text                                         | 索引的注释信息。                                                                | -                                                                                                                                                                                                                                                                                                                                                |
   
 表2WITH ( {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%。 ``` ALTER INDEX tpcds.ds_ship_mode_t1_index7 SET (FILLFACTOR = 60); ```                                                       |
| **INVISIBLE**                                                                                     | 控制优化器是否生成索引扫描相关计划。 **适用场景**：维护期间临时禁用索引，或测试索引对性能的影响。 **取值范围**： - ON表示不生成索引扫描相关计划。  - OFF表示生成索引扫描相关计划。   **默认值**：OFF                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | 设置**优化器不生成索引的扫描相关计划。** ``` ALTER INDEX tpcds.ds_ship_mode_t1_index9 SET (INVISIBLE = ON); ```                                                               |
| **FASTUPDATE**                                                                                    | **仅GIN索引支持该参数**，GIN索引是否使用快速更新，当启用后，数据变更会暂存到待处理列表（Pending List）。 **取值范围**：ON，OFF **默认值**：ON                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 打开快速更新参数**FASTUPDATE**，设置该索引Pending List容量的最大值为8MB。 ``` 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](https://support.huaweicloud.com/devg-dws/dws_04_0925.html)的值决定（默认为4MB）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 打开快速更新参数**FASTUPDATE**，设置该索引Pending List容量的最大值为8MB。 ``` ALTER INDEX tpcds.ds_ship_mode_t1_index10 SET (FASTUPDATE = ON, GIN_PENDING_LIST_LIMIT = 8192); ``` |
   
#### 示例
创建示例表tpcds.ship_mode_t1。
```
DROP SCHEMA IF EXISTS tpcds CASCADE;
CREATE SCHEMA tpcds;
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字段上创建唯一索引。
```
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字段上创建表达式索引。
```
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。
```
ALTER INDEX tpcds.ds_ship_mode_t1_index1 RENAME TO ds_ship_mode_t1_index5;
```
设置索引ds_ship_mode_t1_index2不可用。
```
ALTER INDEX tpcds.ds_ship_mode_t1_index2 UNUSABLE;
```
重建索引ds_ship_mode_t1_index2。
```
ALTER INDEX tpcds.ds_ship_mode_t1_index2 REBUILD;
```
#### 相关链接
[CREATE INDEX](https://support.huaweicloud.com/sqlreference-dws/dws_06_0165.html)，[DROP INDEX](https://support.huaweicloud.com/sqlreference-dws/dws_06_0195.html)，[REINDEX](https://support.huaweicloud.com/sqlreference-dws/dws_06_0218.html)
