更新时间:2024-11-12 GMT+08:00
分享

ALTER INDEX

功能描述

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

注意事项

索引的所有者、拥有索引所在表的INDEX权限的用户或者被授予了ALTER ANY INDEX权限的用户有权限执行此命令,当三权分立开关关闭时,系统管理员默认拥有此权限。

请勿在同一基表上保持大量的不可见索引,否则可能会对INSERT、UPDATE、DELETE等DML操作的性能产生影响。

语法格式

  • 重命名表索引的名称。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        RENAME TO new_name;
    
  • 修改表索引的所属空间。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        SET TABLESPACE tablespace_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;
    
  • 修改索引分区的所属表空间。
    1
    2
    ALTER INDEX [ IF EXISTS ] index_name 
        MOVE PARTITION index_partition_name TABLESPACE new_tablespace;
    
  • 设置分布式全局二级索引状态。
    ALTER INDEX [ IF EXISTS ] index_name GSIVALID;
    ALTER INDEX [ IF EXISTS ] index_name GSIREADY;

    此语法主要用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,修改全局二级索引状态,用户不建议使用。如使用,会返回错误提示信息。

  • 设置分布式全局二级索引可用。
    ALTER INDEX [ IF EXISTS ] index_name GSIUSABLE;

    此语法主要用于VACUUM FULL功能内部调用,修改全局二级索引状态,用户不建议使用,否则可能导致索引数据与表数据不一致。如需启用UNUSABLE状态的GSI,建议使用REINDEX INDEX语法重新创建GSI。

  • 用于设置索引状态为可见。
    ALTER INDEX [ IF EXISTS ] index_name VISIBLE;
    • 此语法仅支持在ORA兼容性数据库下(即sql_compatibility = 'ORA')设置,在其他数据库兼容模式下不支持。
    • 当disable_keyword_options参数设置为“visible”时,VISIBLE关键字不支持使用。
    • 升级未提交阶段,不支持使用此语法。
  • 用于设置索引状态为不可见。
    ALTER INDEX [ IF EXISTS ] index_name INVISIBLE;
    • 此语法仅支持在ORA兼容性数据库下(即sql_compatibility = 'ORA')设置,在其他数据库兼容模式下不支持。
    • 当disable_keyword_options参数设置为“invisible”时,INVISIBLE关键字不支持使用。
    • 升级未提交阶段,不支持使用此语法。
    • 备机读场景下,设置索引状态为不可见后,查询语句的执行计划可能会发生变化,备机查询性能可能会受到影响。
  • 用于将下一个未分配的xid和csn记录在各节点内的临时用户表的reloption中,以备合并临时表时的剪枝。
    ALTER INDEX [ IF EXISTS ] index_name GSIGETXID;

    此语法主要用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,用户不建议使用。如使用,会返回错误提示信息。

  • 用于合并分布式全局二级索引与临时用户表。
    ALTER INDEX [ IF EXISTS ] index_name GSIMERGE;

    此语法主要用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,用户不建议使用。如使用,会返回错误提示信息。

  • 用于在线重建分布式全局二级索引中切换新旧分布式全局二级索引。
    ALTER INDEX [ IF EXISTS ] index_name GSISWITCH;

    此语法主要用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,用户不建议使用。如使用,会返回错误提示信息。

参数说明

  • index_name

    要修改的索引名。

  • IF EXISTS

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

  • RENAME TO new_name

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

  • SET TABLESPACE tablespace_name

    改变索引的表空间为指定表空间,并且把索引相关的数据文件移动到新的表空间里。

    • tablespace_name

      表空间的名称。

      取值范围:已存在的表空间。

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

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

    • storage_parameter

      索引方法特定的参数名。ACTIVE_PAGES表示索引的页面数量,可能比实际的物理文件页面少,可以用于优化器调优。目前只对ustore的分区表local索引生效,且会被vacuum、analyze更新(包括auto vacuum)。不建议用户手动设置该参数,该参数在分布式下无效。对GSI执行ALTER时,对INTERNAL_MASK、APPEND_MODE_INTERNAL、WAIT_CLEAN_GPI、PARTITION_DDL_FLAG、COLLATE、CROSSBUCKET和DEDUPLICATION参数不支持,行为同UBtree,支持FILLFACTOR、INDEXSPLIT参数,ACTIVE_PAGES和WAIT_CLEAN_CBI 不适用于GSI。

    • value

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

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

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

  • [ MODIFY PARTITION index_partition_name ] UNUSABLE

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

  • REBUILD [ PARTITION index_partition_name ]

    用于重建表或者索引分区上的索引。重建索引时,若索引带有lpi_parallel_method选项,取值为PARTITION且表的parallel_workers选项大于0时,不支持对该索引并行重建;无该选项或选项取值为AUTO时,并行重建时会默认走页面级并行重建索引。详见LPI_PARALLEL_METHOD

  • RENAME PARTITION index_partition_name TO new_index_partition_name

    用于重命名索引分区。

  • MOVE PARTITION index_partition_name TABLESPACE new_tablespace

    用于修改索引分区的所属表空间。

  • new_index_partition_name

    新索引分区名。

  • index_partition_name

    索引分区名。

  • new_tablespace

    新表空间。

  • GSIVALID | GSIREADY

    用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,修改分布式全局二级索引状态。

  • GSIUSABLE

    此语法主要用于VACUUM FULL功能内部调用,修改分布式全局二级索引状态。

  • VISIBLE

    用于设置索引状态为可见。

  • INVISIBLE

    用于设置索引状态为不可见。

  • GSIGETXID

    用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,将下一个未分配的xid和csn记录在各节点内的临时用户表的reloption中,以备合并临时表时的剪枝。

  • GSIMERGE

    用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,合并分布式全局二级索引与临时用户表。

  • GSISWITCH

    用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,在线重建分布式全局二级索引中切换新旧分布式全局二级索引。

示例

  • 重命名索引。
    --创建test1表并为其创建索引。
    gaussdb=# CREATE TABLE test1(col1 int, col2 int);
    gaussdb=# CREATE INDEX aa ON test1(col1);
    
    --将索引aa重命名为idx_test1_col1。
    gaussdb=# ALTER INDEX aa RENAME TO idx_test1_col1;
    
    --查询test1表上的索引信息。
    gaussdb=# SELECT tablename,indexname,tablespace FROM pg_indexes WHERE tablename = 'test1';
     tablename |   indexname    | tablespace 
    -----------+----------------+------------
     test1     | idx_test1_col1 | 
    (1 row)
  • 修改索引所属表空间。
    --创建表空间tbs_index1。
    gaussdb=# CREATE TABLESPACE tbs_index1 RELATIVE LOCATION 'tablespace1/tbs_index1';
    
    --修改索引idx_test1_col1的所属表空间为tbs_index1。
    gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 SET TABLESPACE tbs_index1;
    
    --查询test1表上的索引信息。
    gaussdb=# SELECT tablename,indexname,tablespace FROM pg_indexes WHERE tablename = 'test1';
     tablename |   indexname    | tablespace 
    -----------+----------------+------------
     test1     | idx_test1_col1 | tbs_index1
    (1 row)
  • 修改与重置索引存储参数。
    --查看索引idx_test1_col1详细信息。
    gaussdb=# \di idx_test1_col1                         List of relations
     Schema |      Name      | Type  | Owner | Table | Storage 
    --------+----------------+-------+-------+-------+---------
     public | idx_test1_col1 | index | omm   | test1 | 
    (1 row)
    
    --修改索引idx_test1_col1 的填充因子。
    gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 SET (FILLFACTOR = 70);
    --查看索引idx_test1_col1详细信息。
    gaussdb=# \di idx_test1_col1
                             List of relations
     Schema |      Name      | Type  | Owner | Table |     Storage     
    --------+----------------+-------+-------+-------+-----------------
     public | idx_test1_col1 | index | omm   | test1 | {fillfactor=70}
    (1 row)
    --重置索引idx_test1_col1 的存储参数。
    gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 RESET (FILLFACTOR);
    --查看索引idx_test1_col1详细信息。
    gaussdb=# \di idx_test1_col1
                         List of relations
     Schema |      Name      | Type  | Owner | Table | Storage 
    --------+----------------+-------+-------+-------+---------
     public | idx_test1_col1 | index | omm   | test1 | 
    (1 row)
  • 修改索引可用性。
    --设置索引idx_test1_col1不可用。
    gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 UNUSABLE;
    --查看索引idx_test1_col1的可用性。
    gaussdb=# SELECT indisusable FROM pg_index WHERE indexrelid = 'idx_test1_col1'::regclass;
     indisusable 
    -------------
     f
    (1 row)
    
    --重建索引idx_test1_col1。
    gaussdb=# ALTER INDEX idx_test1_col1 REBUILD;
    --查看索引idx_test1_col1的可用性。
    gaussdb=# SELECT indisusable FROM pg_index WHERE indexrelid = 'idx_test1_col1'::regclass;
     indisusable 
    -------------
     t
    (1 row)
    
    --删除。
    gaussdb=# DROP INDEX idx_test1_col1;
    gaussdb=# DROP TABLE test1;
    gaussdb=# DROP TABLESPACE tbs_index1;
  • 重命名索引分区。
    --创建分区表test2。
    gaussdb=# CREATE TABLE test2(col1 int, col2 int) PARTITION BY RANGE (col1)(
        PARTITION p1 VALUES LESS THAN (100),
        PARTITION p2 VALUES LESS THAN (200)
    );
    --创建分区索引。
    gaussdb=# CREATE INDEX idx_test2_col1 ON test2(col1) LOCAL(
        PARTITION p1,
        PARTITION p2
    );
    --重命名索引分区。
    gaussdb=# ALTER INDEX idx_test2_col1 RENAME PARTITION p1 TO p1_test2_idx;
    gaussdb=# ALTER INDEX idx_test2_col1 RENAME PARTITION p2 TO p2_test2_idx;
    
    --查询索引idx_test2_col1分区的名称。
    gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_test2_col1'::regclass;
       relname    
    --------------
     p1_test2_idx
     p2_test2_idx
    (2 rows)
  • 修改索引分区的所属表空间。
    --创建表空间tbs_index2与tbs_index3。
    gaussdb=# CREATE TABLESPACE tbs_index2 RELATIVE LOCATION 'tablespace1/tbs_index2';
    gaussdb=# CREATE TABLESPACE tbs_index3 RELATIVE LOCATION 'tablespace1/tbs_index3';
    
    --修改索引idx_test2_col1分区的所属表空间。
    gaussdb=# ALTER INDEX idx_test2_col1 MOVE PARTITION p1_test2_idx TABLESPACE tbs_index2;
    gaussdb=# ALTER INDEX idx_test2_col1 MOVE PARTITION p2_test2_idx TABLESPACE tbs_index3;
    
    --查询索引idx_test2_col1分区的所属表空间。
    gaussdb=# SELECT t1.relname index_name, 
           t2.spcname tablespace_name
    FROM pg_partition t1, pg_tablespace t2
    WHERE t1.parentid = 'idx_test2_col1'::regclass AND
          t1.reltablespace = t2.oid;
      index_name  | tablespace_name 
    --------------+-----------------
     p1_test2_idx | tbs_index2
     p2_test2_idx | tbs_index3
    (2 rows)
    
    --删除。
    gaussdb=# DROP INDEX idx_test2_col1;
    gaussdb=# DROP TABLE test2;
    gaussdb=# DROP TABLESPACE tbs_index2;
    gaussdb=# DROP TABLESPACE tbs_index3;

相关链接

CREATE INDEXDROP INDEXREINDEX

相关文档