更新时间:2026-07-28 GMT+08:00
分享

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

相关文档