Timescale 云:性能、规模、企业级
自托管产品
MST
您可以在超表上使用唯一索引来强制执行 约束。如果您有主键,那么您就有一个唯一索引。在 PostgreSQL 中,主键是一个带有
NOT NULL
约束的唯一索引。
您不需要在超表上创建唯一索引。当您创建唯一索引时,它必须包含超表的所有分区列。
在超表上创建唯一索引
确定分区列
在创建唯一索引之前,您需要确定超表上允许哪些唯一索引。首先确定您的分区列。
TimescaleDB 传统上使用以下列来分区超表
- 用于创建超表的
time
列。每个 Timescale 超表都按时间分区。 - 任何空间分区列。空间分区是可选的,并非每个超表都包含。
- 用于创建超表的
创建超表
使用 CREATE TABLE 为您的时序数据创建超表。为了对列式存储中的数据进行高效查询,请记住使用最常用于筛选数据的列进行
segmentby
。例如CREATE TABLE hypertable_example(time TIMESTAMPTZ,user_id BIGINT,device_id BIGINT,value FLOAT) WITH (tsdb.hypertable,tsdb.partition_column='time',tsdb.segmentby = 'device_id',tsdb.orderby = 'time DESC');如果您正在自托管 TimescaleDB v2.19.3 或更低版本,请先创建 PostgreSQL 关系表
,然后使用 create_hypertable 进行转换。之后,通过调用 ALTER TABLE 启用 Hypercore。
在超表上创建唯一索引
当您在超表上创建唯一索引时,它必须包含所有分区列。它也可以包含其他列,并且这些列可以按任何顺序排列。您不能在没有
time
列的情况下创建唯一索引,因为time
是一个分区列。例如
通过调用
CREATE UNIQUE INDEX
在time
和device_id
上创建唯一索引CREATE UNIQUE INDEX idx_deviceid_timeON hypertable_example(device_id, time);在
time
、user_id
和device_id
上创建唯一索引。device_id
不是分区列,但这仍然有效CREATE UNIQUE INDEX idx_userid_deviceid_timeON hypertable_example(user_id, device_id, time);
注意
此限制是必要的,以确保索引中的全局唯一性。
如果您在将表转换为超表之前在其上创建唯一索引,则相同的限制反向适用。您只能按唯一索引中的列对表进行分区。
创建关系表
CREATE TABLE another_hypertable_example(time TIMESTAMPTZ,user_id BIGINT,device_id BIGINT,value FLOAT);在表上创建唯一索引
例如,在
device_id
和time
上CREATE UNIQUE INDEX idx_deviceid_timeON another_hypertable_example(device_id, time);将表转换为分区超表
仅按
time
SELECT * from create_hypertable('another_hypertable_example', by_range('time'));按
time
和device_id
SELECT * FROM create_hypertable('another_hypertable_example', by_range('time'));SELECT * FROM add_dimension('another_hypertable_example', by_hash('device_id', 4));
如果您尝试将关系表转换为按
time
和user_id
分区的超表,您将收到错误。这是因为user_id
不是UNIQUE INDEX
的一部分。要修复此错误,请将user_id
添加到您的唯一索引中。
关键词
此页面有问题?报告问题 或 在 GitHub 中编辑此页面
。