将 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 才能转换它?我在下面添加了一些关于我计划如何使用数据和数据结构的数据。
数据属性和用法:
- 可以有多个具有相同 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
- entry_id不是我生成的,我使用唯一约束con1来确保我没有插入重复数据
- 我主要查询event_time的数据,例如创建绘图并执行其他分析
- 此时数据库包含大约 46 亿行,但很快就会包含更多
- 我想利用 TimescaleDB 的速度和良好的压缩性
- 我不太关心插入性能
我一直在考虑的解决方案:
- 将具有相同时间戳的所有事件以某种方式打包到一个数组中,并将它们保持在一行中。我认为这会对压缩产生负面影响,并降低查询数据的灵活性。此外,我可能最终不得不在每次查询时解压数据。
- 删除唯一约束 con1 - 那么我如何确保不会将同一行添加两次?
- 扩展唯一约束 con1 以包括 event_time - 这不会以某种方式降低性能,同时打开错误,我不小心插入了 2 行 entry_id 和 pair_id 但不同 event_time? (虽然我怀疑这可能会发生)
您正确理解 UNIQUE (pair_id, entry_id )
不允许从 table 创建 hypertable,因为唯一约束需要包括分区键,即 event_time
在你的情况下。
我不明白第一个选项(将具有相同时间戳的记录打包到单个记录中)如何帮助提高唯一性。
删除唯一约束将允许创建 hypertable,正如您提到的,您将失去检查约束的可能性。
添加时间列,例如 UNIQUE (pair_id, entry_id, event_time)
是一种很常见的方法,但它允许插入具有不同时间戳的重复项,如您所提到的。在插入期间,它的性能将比选项 2 差。您可以用 unique index 替换 event_time
上的索引(这是您需要的,因为您查询此列,并且它是由 TimescaleDB 自动创建的),这样您可以节省一点点,例如
CREATE UNIQUE INDEX indx ON (event_time, pair_id, entry_id);
- 在每个块上手动创建唯一约束 table。这将保证块内的唯一性,但仍然可能在不同的块中有重复项。主要缺点是您需要在创建新块时弄清楚如何创建它。
TimescaleDB 不支持没有分区键的唯一约束,因为它需要访问所有现有块以检查唯一性,这会降低性能。 (或者它需要创建一个可能很大的全局索引)我认为时间序列数据具有唯一约束的情况并不常见,因为它通常与人工生成的基于计数器的标识符有关。
我有一个 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
问题 2: 我应该如何更改我的 table 或 hypertable 才能转换它?我在下面添加了一些关于我计划如何使用数据和数据结构的数据。
数据属性和用法:
- 可以有多个具有相同 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? (虽然我怀疑这可能会发生)
您正确理解 UNIQUE (pair_id, entry_id )
不允许从 table 创建 hypertable,因为唯一约束需要包括分区键,即 event_time
在你的情况下。
我不明白第一个选项(将具有相同时间戳的记录打包到单个记录中)如何帮助提高唯一性。
删除唯一约束将允许创建 hypertable,正如您提到的,您将失去检查约束的可能性。
添加时间列,例如
UNIQUE (pair_id, entry_id, event_time)
是一种很常见的方法,但它允许插入具有不同时间戳的重复项,如您所提到的。在插入期间,它的性能将比选项 2 差。您可以用 unique index 替换event_time
上的索引(这是您需要的,因为您查询此列,并且它是由 TimescaleDB 自动创建的),这样您可以节省一点点,例如
CREATE UNIQUE INDEX indx ON (event_time, pair_id, entry_id);
- 在每个块上手动创建唯一约束 table。这将保证块内的唯一性,但仍然可能在不同的块中有重复项。主要缺点是您需要在创建新块时弄清楚如何创建它。
TimescaleDB 不支持没有分区键的唯一约束,因为它需要访问所有现有块以检查唯一性,这会降低性能。 (或者它需要创建一个可能很大的全局索引)我认为时间序列数据具有唯一约束的情况并不常见,因为它通常与人工生成的基于计数器的标识符有关。