notebook/996/Hologres/Hologres.md
2025-04-30 17:17:09 +08:00

105 lines
4.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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:如果是分区表,此字段包含定义其边界条件的信息
```