notebook/996/Hologres/Hologres.md

105 lines
4.4 KiB
Markdown
Raw Normal View History

2025-03-12 16:41:00 +08:00
# Hologres 索引与表结构设计指南
## 索引剪枝策略
### 1. 分区剪枝Partition Pruning[1](@ref)
- **作用**:通过查询条件定位目标分区,避免全表扫描
- **适用场景**:日粒度分区表(如`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](@ref)
```sql
-- 复合索引配置表
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如果是分区表此字段包含定义其边界条件的信息
```