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”章节。