更新时间:2024-11-27 GMT+08:00

ALTER INDEX

功能描述

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

注意事项

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

语法格式

  • 重命名表索引的名字。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        RENAME TO new_name;
    
  • 修改表索引的存储参数。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        SET ( {storage_parameter = 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 ];
    
  • 重命名索引分区。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        RENAME PARTITION index_partition_name TO new_index_partition_name;
    

    PG_OBJECT系统表记录索引最后修改时间时不支持对该语法的记录。

  • 添加,修改索引的注释。
    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;
    

参数说明

  • IF EXISTS

    如果指定的索引不存在,则发出一个notice而不是error。

  • RENAME TO

    只改变索引的名字。对存储的数据没有影响。

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

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

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

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

  • [ MODIFY PARTITION index_partition_name ] UNUSABLE

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

  • REBUILD [ PARTITION index_partition_name ]

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

  • RENAME PARTITION

    用于重命名索引分区。

  • COMMENT comment_text

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

  • index_name

    要修改的索引名。

  • new_name

    新的索引名。新的索引名不能与数据库中已有的表名重复。

    取值范围:字符串,且符合标识符命名规范。

  • storage_parameter

    索引方法特定的参数名。

  • value

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

  • new_index_partition_name

    新索引分区名。

  • index_partition_name

    索引分区名。

  • comment_text

    索引的注释信息。

示例

  • 修改表的索引。
    创建示例表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;
    
  • 修改表分区索引。
    创建示例表tpcds.customer_address_p1。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    DROP TABLE IF EXISTS tpcds.customer_address_p1;
    CREATE TABLE tpcds.customer_address_p1
    (
        CA_ADDRESS_SK             INTEGER               NOT NULL,
        CA_ADDRESS_ID             CHAR(16)              NOT NULL,
        CA_STREET_NUMBER          CHAR(10)                      ,
        CA_STREET_NAME            VARCHAR(60)                   ,
        CA_STREET_TYPE            CHAR(15)                      ,
        CA_SUITE_NUMBER           CHAR(10)                      ,
        CA_CITY                   VARCHAR(60)                   ,
        CA_COUNTY                 VARCHAR(30)                   ,
        CA_STATE                  CHAR(2)                       ,
        CA_ZIP                    CHAR(10)                      ,
        CA_COUNTRY                VARCHAR(20)                   ,
        CA_GMT_OFFSET             DECIMAL(5,2)                  ,
        CA_LOCATION_TYPE          CHAR(20)
    )
    DISTRIBUTE BY HASH(CA_ADDRESS_SK)
    PARTITION BY RANGE(CA_ADDRESS_SK)
    ( 
       PARTITION p1 VALUES LESS THAN (3000),
       PARTITION p2 VALUES LESS THAN (5000) ,
       PARTITION p3 VALUES LESS THAN (MAXVALUE) 
    )
    ENABLE ROW MOVEMENT;
    

    创建分区表索引ds_customer_address_p1_index2,并指定索引分区的名字。

    1
    2
    3
    4
    5
    6
    7
    8
    DROP INDEX IF EXISTS ds_customer_address_p1_index2;
    CREATE INDEX ds_customer_address_p1_index2 ON tpcds.customer_address_p1(CA_ADDRESS_SK) LOCAL
    (
        PARTITION CA_ADDRESS_SK_index1,
        PARTITION CA_ADDRESS_SK_index2,
        PARTITION CA_ADDRESS_SK_index3 
    ) 
    ;
    

    重命名分区表的分区索引tpcds.ds_customer_address_p1_index2:

    1
    ALTER INDEX tpcds.ds_customer_address_p1_index2 RENAME PARTITION CA_ADDRESS_SK_index1 TO CA_ADDRESS_SK_index4;
    

    修改索引的注释:

    1
    ALTER INDEX tpcds.ds_customer_address_p1_index2 COMMENT 'comment_ds_customer_address_p1_index2';
    

相关链接

CREATE INDEXDROP INDEXREINDEX