如何创建 TimescaleDB Hypertable,并在非唯一时间戳上进行时间分区?
无需在时间维度上创建唯一约束(uniqueconstraints not required)。这有效:
CREATE TABLE event (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');
请注意,主键id
已移除。
如果要创建唯一约束或主键,那么TimescaleDB要求任何唯一约束或主键都包含时间维度。这类似于 PostgreSQL 中的限制声明性分区 https://www.postgresql.org/docs/12/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE将分区键包含到唯一约束中:
分区表上的唯一约束(以及主键)必须包括所有分区键列。存在此限制是因为 PostgreSQL 只能单独强制每个分区的唯一性。
TimescaleDB 还单独强制每个块的唯一性。保持块之间的唯一性会极大地影响摄取性能。
最常见的方法解决主键问题的方法是创建一个复合键并包含问题中建议的时间维度。如果不需要时间维度上的索引(预计不会只查询时间),那么可以避免时间维度上的索引:
CREATE TABLE event_hyper (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL,
PRIMARY KEY (id, ts)
);
SELECT create_hypertable('event_hyper', 'ts', create_default_indexes => FALSE);
也可以使用整数列作为时间维度。重要的是,此类列具有时间维度属性:该值随着时间的推移而增加,这对于插入性能很重要,并且查询将选择一个时间范围,这对于大型数据库的查询性能至关重要。常见情况是存储 unix 纪元。
Since id
in event_hyper
是SERIAL,它会随着时间的推移而增加。但是,我怀疑查询是否会选择其上的范围。为了完整性,SQL 将是:
CREATE TABLE event_hyper (
id serial PRIMARY KEY,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event_hyper', 'id', chunk_time_interval => 1000000);