# REINDEX
#### 功能描述
为表中的数据重建索引。
在以下几种情况下需要使用REINDEX重建索引：
- 索引崩溃，并且不再包含有效的数据。
- 索引变得"臃肿"，包含大量的空页或接近空页。
- 为索引更改了存储参数（例如填充因子），并且希望这个更改完全生效。 使用CONCURRENTLY选项创建索引失败，留下了一个"非法"索引。
  
 
#### 注意事项
- REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。
- 存算分离架构下，不支持REINDEX全库索引。
- 在GUC参数enable_consistent_oid为on时，对同一张分区表进行CREATE INDEX与REINDEX TABLE并发操作时，低概率会导致不同节点间分区索引的数量不一致，进而导致REINDEX TABLE报错。出现此情况时，重试执行REINDEX TABLE语句即可成功。
- 使用REINDEX INDEX PARTITION重建索引分区，会在对应的索引分区对象上增加排他锁。在重建过程中，阻止使用该索引分区的读写操作（如索引扫描），不使用该索引分区的读写操作不受影响。
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/warning_3.0-zh-cn.png)
- 避免在业务高峰期执行对大表执行CREATE INDEX和REINDEX操作。
- 更多开发设计规范参见[总体开发设计规范](https://support.huaweicloud.com/devg-dws/dws_04_0075.html)。
 
#### 语法格式
- 重建全库索引或者系统表的索引。
  ```
  REINDEX { DATABASE | SYSTEM } name [ FORCE ];
  ```
  

- 重建普通索引或者普通表上的索引。
  ```
  REINDEX { INDEX |  TABLE  } name [ FORCE | WITHOUT UNUSABLE ]
  ```
  
- 重建索引分区或者分区上的索引。
  ```
  REINDEX  { |   TABLE} name
      PARTITION partition_name [ FORCE | WITHOUT UNUSABLE ];
  ```
  
 
#### 参数说明
表1REINDEX参数说明 
| 参数               | 描述                                                                                                                                          | 取值范围                                                                                                                                                                                                                                                                          |
|:---|:---|:---|
| 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，则这里应该指定分区的名字。   |
   
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/notice_3.0-zh-cn.png)
REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。
#### 示例
重建一个单独索引：
```
DROP TABLE IF EXISTS customer;
CREATE TABLE customer (a int, b int) DISTRIBUTE BY HASH(a);
CREATE  UNIQUE INDEX customer_index1 ON customer (a);
REINDEX INDEX customer_index1;
```
重建表customer上的所有索引：
```
DROP TABLE IF EXISTS customer;
CREATE TABLE customer (a int, b int) DISTRIBUTE BY HASH(a);
CREATE UNIQUE INDEX customer_index1 ON customer (a);
CREATE INDEX customer_index2 ON customer (b);
REINDEX TABLE customer;
```
重建分区表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;
```
