更新时间:2024-09-02 GMT+08:00

REINDEX

功能描述

为表中的数据重建索引。

在以下几种情况下需要使用REINDEX重建索引:

  • 索引崩溃,并且不再包含有效的数据。
  • 索引变得“臃肿”,包含大量的空页或接近空页。
  • 为索引更改了存储参数(例如填充因子),并且希望这个更改完全生效。

    使用CONCURRENTLY选项创建索引失败,留下了一个“非法”索引。

注意事项

  • REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。
  • 存算分离架构下,不支持REINDEX全库索引。

语法格式

  • 重建全库索引或者系统表的索引。
    1
    REINDEX { DATABASE | SYSTEM } name [ FORCE ];
    
  • 重建普通索引或者普通表上的索引。
    1
    REINDEX { INDEX |  TABLE  } name [ FORCE | WITHOUT UNUSABLE ]
    
  • 重建索引分区或者分区上的索引。
    1
    2
    REINDEX  { |   TABLE} name
        PARTITION partition_name [ FORCE | WITHOUT UNUSABLE ];
    

参数说明

  • INDEX

    重新建立指定的索引。

  • TABLE

    重新建立指定表的所有索引,如果表有从属的"TOAST"表,则这个表也会重建索引。

  • DATABASE

    重建当前数据库里的所有索引。

  • SYSTEM

    在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。

  • name

    需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。

    REINDEX DATABASE和SYSTEM只能重建当前数据库的索引,所以name必须和当前数据库名称相同。

  • FORCE

    无效选项,会被忽略。

  • WITHOUT UNUSABLE

    指定该参数时,在REINDEX时会忽略对象上的UNUSABLE索引或者UNUSABLE索引分区。该参数仅9.1.0.100及以上版本支持。

  • partition_name

    需要重建索引的分区的名字或者索引分区的名字。

    取值范围:

    • 如果前面是REINDEX INDEX,则这里应该指定索引分区的名字;
    • 如果前面是REINDEX TABLE,则这里应该指定分区的名字;

REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。

示例

重建一个单独索引:

1
REINDEX INDEX tpcds.tpcds_customer_index1;

重建表tpcds.customer_t1上的所有索引:

1
REINDEX TABLE tpcds.customer_t1;

重建分区表customer_address分区P1的分区索引:

DROP TABLE IF EXISTS customer_address;
CREATE TABLE customer_address
(
    ca_address_sk       INTEGER                  NOT NULL   ,
    ca_address_id       CHARACTER(16)            NOT NULL   ,
    ca_street_number    CHARACTER(10)                       ,
    ca_street_name      CHARACTER varying(60)               ,
    ca_street_type      CHARACTER(15)                       ,
    ca_suite_number     CHARACTER(10)                    
)
DISTRIBUTE BY HASH (ca_address_sk)
PARTITION BY RANGE(ca_address_sk)
(
        PARTITION P1 VALUES LESS THAN(2450815),
        PARTITION P2 VALUES LESS THAN(2451179),
        PARTITION P3 VALUES LESS THAN(2451544),
        PARTITION P4 VALUES LESS THAN(MAXVALUE)
);

CREATE INDEX customer_address_index on customer_address(CA_ADDRESS_SK) LOCAL;

REINDEX TABLE customer_address PARTITION P1;