将 PostgreSQL table 转换为 TimescaleDB hypertable

Converting PostgreSQL table to TimescaleDB hypertable

我有一个 PostgreSQL table,我正在尝试将其转换为 TimescaleDB hypertable。

table 看起来如下:

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
)

当我尝试使用以下命令将此 table 转换为 TimescaleDB hypertable 时:

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)

问题一:由此post我的理解是,这是因为我指定了唯一约束(pair_id_fkey)它不包含我分区的列 - event_time。对吗?

问题 2: 我应该如何更改我的 table 或 hypertable 才能转换它?我在下面添加了一些关于我计划如何使用数据和数据结构的数据。

数据属性和用法:

我一直在考虑的解决方案:

您正确理解 UNIQUE (pair_id, entry_id ) 不允许从 table 创建 hypertable,因为唯一约束需要包括分区键,即 event_time 在你的情况下。

  1. 我不明白第一个选项(将具有相同时间戳的记录打包到单个记录中)如何帮助提高唯一性。

  2. 删除唯一约束将允许创建 hypertable,正如您提到的,您将失去检查约束的可能性。

  3. 添加时间列,例如 UNIQUE (pair_id, entry_id, event_time) 是一种很常见的方法,但它允许插入具有不同时间戳的重复项,如您所提到的。在插入期间,它的性能将比选项 2 差。您可以用 unique index 替换 event_time 上的索引(这是您需要的,因为您查询此列,并且它是由 TimescaleDB 自动创建的),这样您可以节省一点点,例如

CREATE UNIQUE INDEX indx ON (event_time, pair_id, entry_id);
  1. 在每个块上手动创建唯一约束 table。这将保证块内的唯一性,但仍然可能在不同的块中有重复项。主要缺点是您需要在创建新块时弄清楚如何创建它。

TimescaleDB 不支持没有分区键的唯一约束,因为它需要访问所有现有块以检查唯一性,这会降低性能。 (或者它需要创建一个可能很大的全局索引)我认为时间序列数据具有唯一约束的情况并不常见,因为它通常与人工生成的基于计数器的标识符有关。