notebook/Hologres/Hologres.md
2025-03-12 16:41:00 +08:00

4.4 KiB
Raw Permalink Blame History

Hologres 索引与表结构设计指南

索引剪枝策略

1. 分区剪枝Partition Pruning1

  • 作用:通过查询条件定位目标分区,避免全表扫描
  • 适用场景:日粒度分区表(如event_time_column字段)
  • 注意事项:非分区表自动跳过此过程

2. 分片剪枝Shard Pruning

  • 核心参数distribution_key(分布键)
  • 最佳实践
    • 选择高基数字段用户ID、订单ID等
    • JOIN表使用相同分布键实现Local Join
  • 资源影响:未命中分片时需全分片扫描,增加资源消耗

3. 文件剪枝Segment Key Pruning

  • 依赖字段event_time_column/segment_key
  • 作用:定位节点内数据文件,减少文件扫描量

4. 聚簇剪枝Clustering Key Pruning

  • 核心参数clustering_key
  • 优势:加速范围查询和排序操作

表结构定义示例

列存表示例3,7

-- 复合索引配置表
CREATE TABLE tbl_1 (
    id bigint NOT NULL,
    name text NOT NULL,
    age bigint NOT NULL,
    class text,
    reg_timestamp timestamptz NOT NULL,
    PRIMARY KEY (id)
) WITH (
    orientation = 'column',
    distribution_key = 'id',
    clustering_key = 'age',
    event_time_column = 'reg_timestamp',
    bitmap_columns = 'name,class',
    dictionary_encoding_columns = 'class:auto'
);

-- 简化配置表
CREATE TABLE public.tbl_col (
    id text NOT NULL,
    name text NOT NULL,
    class text NOT NULL,
    in_time timestamptz NOT NULL,
    PRIMARY KEY (id)
) WITH (
    orientation = 'column',
    clustering_key = 'class',
    bitmap_columns = 'name',
    event_time_column = 'in_time'
);

列存会默认创建更多的索引,包括对字符串类型创建bitmap索引,这些索引可以显著加速查询过滤和统计


primary key 主键
distribution_key 分布  
event_time_column 单调递增或单调递减的有序字段
clustering_key   Cluster Filter算子,表明命中了Clustering Key
dictionary_encoding_columns字典编码
bitmap_columns 位图索引



relname:关系(表、索引等)的名字。
relnamespace:该关系所属的命名空间(通常是模式schema的OID)。
reltype:该关系的数据类型的OID(如果有的话;例如,对于一个复合类型)。
reloftype:该关系的对象类型的OID(如果有的话;例如,对于一个数组类型)。
relowner:该关系的所有者的角色ID
relam:如果这是一个访问方法(如索引),则为该访问方法的OID
relfilenode:该关系对应的文件节点号。
reltablespace:该关系所在的空间的OID(如果没有指定,则使用默认值)。
relpages:该关系占用的页面数(估算值)。
reltuples:该关系中的行数(估算值)。
relallvisible:所有可见行的数量(用于VACUUM操作)。
reltoastrelid:如果存在,指向该关系的TOAST表的OID
relhasindex:布尔值,指示是否有索引。
relisshared:布尔值,指示该关系是否跨数据库共享。
relpersistence:持久性级别,可以是永久('p')、临时('u')、或不可持久('t')。
relkind:关系的类型,可以是普通表('r')、索引('i')、序列('S')、视图('v')、物化视图('m')、组合类型('c')、外部表('f')、分区表('p')等。
relnatts:该关系定义的列数。
relchecks:该关系上的检查约束数。
relhasoids:布尔值,指示该关系是否有OID列
relhasrules:布尔值,指示是否有规则。
relhastriggers:布尔值,指示是否有触发器。
relhassubclass:布尔值,指示是否有子类(即继承表)。
relrowsecurity:布尔值,指示是否启用了行级安全。
relforcerowsecurity:布尔值,指示是否强制行级安全。
relispopulated:布尔值,指示物化视图是否已填充数据。
relreplident:复制标识符类型,可以是 'd'(默认)、'n'(无)、'f'(完整)、或'i'(索引)。
relispartition:布尔值,指示该关系是否是一个分区。
relrewrite:如果存在,指向重写系统的OID
relfrozenxid:该关系的事务ID,当所有旧的XID都被冻结时更新
relminmxid:最小的多事务ID,当所有旧的MXID都过期时更新
relacl:该关系的访问权限列表。
reloptions:该关系的选项列表。
relpartbound:如果是分区表,此字段包含定义其边界条件的信息