Timescale 云:性能、规模、企业级

自托管产品

MST

您可以在超表上使用唯一索引来强制执行 约束。如果您有主键,那么您就有一个唯一索引。在 PostgreSQL 中,主键是一个带有 NOT NULL 约束的唯一索引。

您不需要在超表上创建唯一索引。当您创建唯一索引时,它必须包含超表的所有分区列。

在超表上创建唯一索引

  1. 确定分区列

    在创建唯一索引之前,您需要确定超表上允许哪些唯一索引。首先确定您的分区列。

    TimescaleDB 传统上使用以下列来分区超表

    • 用于创建超表的 time 列。每个 Timescale 超表都按时间分区。
    • 任何空间分区列。空间分区是可选的,并非每个超表都包含。
  2. 创建超表

    使用 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。

  3. 在超表上创建唯一索引

    当您在超表上创建唯一索引时,它必须包含所有分区列。它也可以包含其他列,并且这些列可以按任何顺序排列。您不能在没有 time 列的情况下创建唯一索引,因为 time 是一个分区列。

    例如

    • 通过调用 CREATE UNIQUE INDEXtimedevice_id 上创建唯一索引

      CREATE UNIQUE INDEX idx_deviceid_time
      ON hypertable_example(device_id, time);
    • timeuser_iddevice_id 上创建唯一索引。

      device_id 不是分区列,但这仍然有效

      CREATE UNIQUE INDEX idx_userid_deviceid_time
      ON hypertable_example(user_id, device_id, time);
    注意

    此限制是必要的,以确保索引中的全局唯一性。

如果您在将表转换为超表之前在其上创建唯一索引,则相同的限制反向适用。您只能按唯一索引中的列对表进行分区。

  1. 创建关系表

    CREATE TABLE another_hypertable_example(
    time TIMESTAMPTZ,
    user_id BIGINT,
    device_id BIGINT,
    value FLOAT
    );
  2. 在表上创建唯一索引

    例如,在 device_idtime

    CREATE UNIQUE INDEX idx_deviceid_time
    ON another_hypertable_example(device_id, time);
  3. 将表转换为分区超表

    • 仅按 time

      SELECT * from create_hypertable('another_hypertable_example', by_range('time'));
    • timedevice_id

      SELECT * FROM create_hypertable('another_hypertable_example', by_range('time'));
      SELECT * FROM add_dimension('another_hypertable_example', by_hash('device_id', 4));

    如果您尝试将关系表转换为按 timeuser_id 分区的超表,您将收到错误。这是因为 user_id 不是 UNIQUE INDEX 的一部分。要修复此错误,请将 user_id 添加到您的唯一索引中。

关键词

此页面有问题?报告问题 或 在 GitHub 中编辑此页面