
# 例行重建索引
#### 背景信息
数据库经过多次删除操作后，索引页面上的索引键将被删除，造成索引膨胀。例行重建索引，可有效地提高查询效率。
数据库支持的索引类型包含B-tree索引、GIN索引和PSORT索引。
- 对于B-tree索引，例行重建索引可有效地提高查询效率。
  - 如果数据发生大量删除后，索引页面上的索引键将被删除，导致索引页面数量的减少，造成索引膨胀。重建索引可回收浪费的空间。
  
  - 新建的索引中逻辑结构相邻的页面，通常在物理结构中也是相邻的，所以一个新建的索引比更新了多次的索引访问速度要快。
   
- 对于非B-tree索引，不建议例行重建。
 
#### 重建索引
重建索引有以下两种方式：
- 先删除索引（DROP INDEX），再创建索引（CREATE INDEX）。 在删除索引过程中，会在父表上增加一个短暂的排他锁，阻止相关读写操作。在创建索引过程中，会锁住写操作但是不会锁住读操作，此时读操作只能使用顺序扫描。
  
- 使用REINDEX语句重建索引。
  - 使用REINDEX TABLE语句重建索引，会在重建过程中增加排他锁，阻止相关读写操作。
  
  - 使用REINDEX INTERNAL TABLE语句重建desc表（包括）的索引，会在重建过程中增加排他锁，阻止相关读写操作。
  
  - 使用REINDEX INDEX PARTITION重建索引分区，会在对应的索引分区对象上增加排他锁。在重建过程中，阻止使用该索引分区的读写操作（如索引扫描），不使用该索引分区的读写操作不受影响。
   
 
#### 操作步骤
假定在导入表"areaS"上的"area_id"字段上存在普通索引"areaS_idx"。重建索引有以下两种方式：
- 先删除索引（DROP INDEX），再创建索引（CREATE INDEX）
  1. 删除索引。
     ```
     DROP INDEX areaS_idx;
     ```
     
  
  2. 创建索引。
     ```
     CREATE INDEX areaS_idx ON areaS (area_id);
     ```
     
   
- 使用REINDEX重建索引。
  - 使用REINDEX TABLE语句重建索引。
    ```
    REINDEX TABLE areaS;
    ```
    
  
  - 使用REINDEX INTERNAL TABLE重建desc表（包括）的索引。
    ```
    REINDEX INTERNAL TABLE areaS;
    ```
    
   
 
