mars3_default_brin

mars3_default_brin 是 MARS3 存储引擎的一项重要功能,在表级别提供了默认的 brin 索引支持,可以在 SeqScan 时自动过滤数据,无需手动创建索引。

使用方式

mars3_default_brin 通过在定义中的 default_brinkeys 参数来启用。

create table t
(c1 bigint, c2 bigint, c3 bigint)
using mars3
with(mars3options='default_brinkeys=30');

该参数为int值(默认值为 30):

  • 0 :不启用默认的 default_brin ;
  • -1:系统会自动为所有列中支持 <>= 操作符的列创建 default_brin 索引;
  • N :系统会自动为前N列中支持 <>= 操作符的列创建 default_brin 索引。 可以通过 mars3_brinkeys 函数查看表中有哪些列有 brinkey。

示例用法

  1. 创建一个名为t的表,使用 MARS3存储引擎。表包含三个bigint类型的列:c1、c2 和 c3。通过 mars3options 参数设置 default_brinkeys=2,表示自动为前 2 列创建 brin 索引
    create table t
     (c1 bigint, c2 bigint, c3 bigint)
     using mars3
     with(mars3options='default_brinkeys=2');
  2. 向表t中插入数据。使用 generate_series 函数生成 1 到 1000000 的序列,向行中写入随机数据。
    insert into t select i,i,i from generate_series(1,1000000) as i;
  3. 执行 VACUUM 操作清理表 t。对于 MARS3 表,使行存数据进入列存层级创建索引。
    vacuum t;
  4. 查询表 t 中 c1 值小于 1000 的记录数量
  • 由于 default_brinkeys=2,c1 作为前两列之一会有自动创建的 mars3_default_brin 索引,利用索引加速查询
    select count() from t where c1 < 1000;
  1. 查询表 t 中 c3 值小于 1000 的记录数量
  • 由于 default_brinkeys=2,c3 作为第三列不会有自动创建的 mars3_default_brin 索引,这个查询可能不会使用索引,性能相较与前一个查询较差
    select count() from t where c3 < 1000 

主要区别

与 mars3_brin 对比

mars3_brin mars3_default_brin
创建方式 需要手动创建 自动创建,无需手动操作
查询支持 仅支持 IndexScan 时过滤数据 支持Indexscan、SeqScan 时过滤数据
技术版本 brinV2 brinV2
参数化查询 支持参数化查询(param-IndexScan) 支持参数化查询(param-SeqScan)