【发布时间】:2021-08-07 11:21:30
【问题描述】:
我有一个 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)
问题 1: 从这篇帖子 How to convert a simple postgresql table to hypertable or timescale db table using created_at for indexing 我的理解是,这是因为我指定了一个唯一约束 (pair_id_fkey),它不包含我正在分区的列 - event_time。对吗?
问题 2:我应该如何更改我的表或超表才能进行转换?我已经添加了一些关于我计划如何使用数据和数据结构的数据。
数据属性和用途:
- 可以有多个具有相同 event_time 的条目 - 这些条目的 entry_id 是按顺序排列的
- 这意味着如果我有 2 个条目 (event_time 2021-05-18::10:16, id 105,
) 和 (event_time 2021-05-18::10:16, id 107, ) 那么 id 为 106 的条目也会有 event_time 2021-05-18::10:16
- 这意味着如果我有 2 个条目 (event_time 2021-05-18::10:16, id 105,
- entry_id 不是我生成的,我使用唯一约束 con1 来确保我没有插入重复数据
- 我将主要在 event_time 上查询数据,例如创建绘图并执行其他分析
- 此时数据库包含大约 46 亿行,但应该很快会包含更多
- 我想利用 TimescaleDB 的速度和良好的压缩性能
- 我不太关心插入性能
我一直在考虑的解决方案:
- 以某种方式将具有相同时间戳的所有事件打包到一个数组中,并将它们保持在一行中。我认为这会对压缩产生不利影响,并且在查询数据时提供较少的灵活性。此外,我可能最终不得不解压缩每个查询的数据。
- 删除唯一约束 con1 - 那我如何确保不会将同一行添加两次?
- 扩展唯一约束 con1 以包含 event_time - 这不会以某种方式降低性能,同时会导致我不小心插入 2 行的 entry_id 和 pair_id 但 event_time 不同的错误? (我怀疑这可能会发生)
【问题讨论】: