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