
# bucket索引推荐使用场景
CBI索引以普通段页式方式存储，可以理解为所有bucket索引元组全部创建到统一的一个索引中；LBI索引以hashbucket段页式方式存储，可以理解为每个bucket各自创建一个子索引，由LBI索引统一管理。
LBI为hashbucket存储提供bucket内的索引能力；CBI为hashbucket存储提供跨bucket的索引能力，在创建索引时，一个索引文件可以对应表级或分区级的所有bucket文件。CBI索引可以为指定粒度的表提供跨bucket的索引扫描，避免顺序扫描当前表下的大量bucket文件才能查到目标元组，提升查询性能。CBI、LBI推荐使用场景：
- 业务语句的hash分布列都在同一个bucket上，或者语句条件包含hash分布列时，剪枝后扫描结果只涉及少数bucket时，需要依靠bucket内的索引能力，推荐使用LBI；
- 业务语句的条件不包含hash分布列，或按条件过滤后仍需要扫描较多bucket时，需要依靠跨bucket的索引能力，推荐使用CBI。
#### bucket索引支持情况
hashbucket分区表索引根据是否为GPI索引/是否为CBI索引组成四种组合，内核支持情况见下表：
|      hashbucket分区表索引类型      | CBI(cross-bucket index) | LBI(local-bucket index) |
|---|---|---|
| GPI(global partition index) | yes                     | yes                     |
| LPI(local partition index)  | yes                     | yes                     |
   
- 创建hashbucket表的LBI索引。
  ```
  gaussdb=# CREATE INDEX idx1 ON hashbucket_table1(c1) WITH(crossbucket=off);
  CREATE INDEX
  ```
  
- 创建hashbucket表的CBI索引。
  ```
  gaussdb=# CREATE INDEX idx2 ON hashbucket_table2(c1) WITH(crossbucket=on);
  CREATE INDEX
  ```
  

- 创建hashbucket分区表的LPI+LBI索引。
  ```
  gaussdb=# CREATE INDEX idx1_tb1 ON hashbucket_partiton_table_range1(c1) LOCAL WITH(crossbucket=off);
  CREATE INDEX
  ```
  

- 创建hashbucket分区表的LPI+CBI索引。
  ```
  gaussdb=# CREATE INDEX idx2_tb1 ON hashbucket_partiton_table_range1(c2) LOCAL WITH(crossbucket=on);
  CREATE INDEX
  ```
  

- 创建hashbucket分区表的GPI+LBI索引。
  ```
  gaussdb=# CREATE INDEX idx1_tb1 ON hashbucket_partiton_table_range1(c1) GLOBAL WITH(crossbucket=off);
  CREATE INDEX
  ```
  

- 创建hashbucket分区表的GPI+CBI索引。
  ```
  gaussdb=# CREATE INDEX idx2_tb1 ON hashbucket_partiton_table_range1(c2) GLOBAL WITH(crossbucket=on);
  CREATE INDEX
  ```
  
具体语法请参见《参考》中"SQL参考 \> SQL语法 \> C \> CREATE INDEX"章节。
