我有一个 PostgreSQL 表,我正在尝试将其转换为 TimescaleDB 超表。
该表如下所示:
CREATE TABLE public.data
(
event_time timestamp with time zone NOT NULL,
pair_id integer NOT NULL,
entry_id bigint NOT NULL,
event_data int NOT NULL,
CONSTRAINT con1 UNIQUE (pair_id, entry_id ),
CONSTRAINT pair_id_fkey FOREIGN KEY (pair_id)
REFERENCES public.pairs (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
当我尝试使用以下命令将此表转换为 TimescaleDB 超表时:SELECT create_hypertable(
'data',
'event_time',
chunk_time_interval => INTERVAL '1 hour',
migrate_data => TRUE
);
我收到错误:ERROR: cannot create a unique index without the column "event_time" (used in partitioning)
问题一:来自这篇文章 How to convert a simple postgresql table to hypertable or timescale db table using created_at for indexing我的理解是,这是因为我指定了一个唯一约束 (pair_id_fkey),它不包含我正在分区的列 - event_time。那是对的吗?问题2:我应该如何更改我的 table 或 hypertable 以便能够转换它?我已经添加了一些关于我计划如何使用数据和下面数据结构的数据。
数据属性和用法:
我一直在考虑的解决方案:
最佳答案
您正确理解 UNIQUE (pair_id, entry_id )
不允许从表创建超表,因为唯一约束需要包含分区键,即 event_time
在你的情况下。
UNIQUE (pair_id, entry_id, event_time)
是一种很常见的方法,但它允许插入您提到的具有不同时间戳的重复项。在插入过程中,它的性能将比选项 2 差。您可以替换 event_time
上的索引(这是您需要的,因为您在此列上进行查询,并且它是由 TimescaleDB 自动创建的)与 unique index ,所以你可以节省一点,例如,CREATE UNIQUE INDEX indx ON (event_time, pair_id, entry_id);
TimescaleDB 不支持没有分区键的唯一约束,因为它需要访问所有现有块来检查唯一性,这会降低性能。 (或者它需要创建一个可能很大的全局索引)我认为时间序列数据具有唯一约束并不常见,因为它通常与人工生成的基于计数器的标识符有关。
关于postgresql - 将 PostgreSQL 表转换为 TimescaleDB 超表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67582526/