设计使用列存索引(IMCI)的表结构时,需要先确认目标列的数据类型是否在支持范围内。列存索引支持写入和查询整数与数值、字符串与二进制、日期和时间等类别的 PostgreSQL 数据类型,也支持部分数组类型。Enum、复合类型和 Domain 暂不支持,CREATE CSI、ALTER TYPE 和 ADD COLUMN 三类 DDL 场景的类型限制也存在差异。
支持范围
列存索引支持的标量数据类型如下表所示。排序规则和 DDL 场景会对部分类型附加使用条件,具体规则见使用限制。
类别 | 支持的数据类型 |
整数与数值 |
|
字符串与二进制 |
|
日期和时间 |
|
其他标量 |
|
此外,列存索引还支持以下数组类型:
整数与数值:
SMALLINT[]、INTEGER[]、BIGINT[]、NUMERIC[]、REAL[]、DOUBLE PRECISION[]、OID[]字符串与二进制:
CHAR[]、VARCHAR[]、TEXT[]、BYTEA[]日期和时间:
DATE[]、TIME[]、TIMETZ[]、TIMESTAMP[]、TIMESTAMPTZ[]、INTERVAL[]其他标量:
BOOLEAN[]、JSON[]、JSONB[]、UUID[]
SERIAL 和 BIGSERIAL 不是独立的存储类型,分别以 INTEGER 和 BIGINT 存储,因此可以作为列存索引的索引列。
使用限制
不支持的类型:列存索引暂不支持 Enum、复合类型和 Domain。
排序规则:非默认排序规则不能用于列存索引的索引列。
DDL 场景差异:
CREATE CSI、ALTER TYPE和ADD COLUMN三类场景的类型限制并不完全相同。其中ADD COLUMN使用非空常量默认值时,只支持具有无损默认值编码器的类型。三类场景的完整类型限制,请参见DDL支持范围与限制。
示例
以下示例创建一张包含多种受支持类型列的表,并为该表创建列存索引。
CREATE TABLE csi_type_example (
id bigint PRIMARY KEY,
amount numeric(18, 2),
occurred_at timestamptz,
tags text[],
description text,
flags bit varying(16)
);
CREATE INDEX csi_type_example_idx ON csi_type_example USING csi;示例中的各列分别对应支持范围列出的整数与数值(bigint、numeric)、日期和时间(timestamptz)、字符串与二进制(text)、其他标量(bit varying)和数组(text[])类别。