gpt4 book ai didi

postgresql - 如何在非唯一时间戳上创建具有时间分区的 TimescaleDB Hypertable?

转载 作者:行者123 更新时间:2023-12-04 01:07:17 29 4
gpt4 key购买 nike

我刚刚开始使用 TimescaleDB 并想在带有事件的表上创建一个超表。
最初我想到遵循以下常规模式:

CREATE TABLE event (
id serial PRIMARY KEY,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);

CREATE INDEX event_ts_idx on event(ts);
但是,当我尝试使用以下查询创建超表时:
SELECT create_hypertable('event', 'ts');
我得到: ERROR: cannot create a unique index without the column "ts" (used in partitioning)经过一些研究,似乎时间戳本身需要成为(或部分)主键。
但是,我不想要时间戳 ts是独一无二的。这些高频事件很可能会在同一微秒内重合( timestamp 类型的最大分辨率)。这就是我首先研究 TimescaleDB 的全部原因。
在这种情况下,最佳做法是什么?
我在想也许保留 serial id作为主键的一部分,并使其复合如下:
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');
这种工作,但我不确定这是否是正确的方法,或者我是否正在创建一个复杂的主键,这会减慢插入速度或产生其他问题。
当使用 TimescaleDB 超表时时间戳可能发生冲突时,正确的方法是什么?

最佳答案

How to create TimescaleDB Hypertable with time partitioning on non unique timestamp?


无需在时间维度上创建唯一约束。这有效:
CREATE TABLE event (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');
注意 id 上的主键已移除。
TimescaleDB 要求任何唯一约束或主键都包含时间维度。这类似于 declarative partitioning 中 PostgreSQL 的限制将分区键包含在唯一约束中:

Unique constraints (and hence primary keys) on partitioned tables must include all the partition key columns. This limitation exists because PostgreSQL can only enforce uniqueness in each partition individually.


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 epoch。
idevent_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);

关于postgresql - 如何在非唯一时间戳上创建具有时间分区的 TimescaleDB Hypertable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66032256/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com