Timescale Cloud:性能、扩展、企业级

自托管产品

MST

Hypercore 是 Timescale 超表使用的混合行-列式存储引擎。传统数据库在快速插入(基于行的存储)和高效分析(列式存储)之间存在权衡。Hypercore 消除了这种权衡,允许在不牺牲事务能力的情况下进行实时分析。

Hypercore 根据数据生命周期以最有效的方式动态存储数据

  • 最新数据的行式存储:最新的数据块(可能更多)始终存储在行存储中,确保快速插入、更新和低延迟的单记录查询。此外,行式存储还用作列式存储的写入直通(writethrough)。
  • 用于分析性能的列式存储:数据块会自动压缩到列存储中,优化存储效率并加速分析查询。

与传统列式数据库不同,Hypercore 允许数据在任何阶段进行插入或修改,使其成为高摄取事务性工作负载和实时分析的灵活解决方案——全部在一个数据库中实现。

当您将数据块从行存储转换为列存储时,多条记录会分组为一行。这一行的列采用类似数组的结构来存储所有数据。例如,以下行存储数据块中的数据

时间戳设备 ID设备类型CPU磁盘 IO
12:00:01ASSD70.1113.4
12:00:01BHDD69.7020.5
12:00:02ASSD70.1213.2
12:00:02BHDD69.6923.4
12:00:03ASSD70.1413.0
12:00:03BHDD69.7025.2

被转换为列存储中的一行数组并压缩

时间戳设备 ID设备类型CPU磁盘 IO
[12:00:01, 12:00:01, 12:00:02, 12:00:02, 12:00:03, 12:00:03][A, B, A, B, A, B][SSD, HDD, SSD, HDD, SSD, HDD][70.11, 69.70, 70.12, 69.69, 70.14, 69.70][13.4, 20.5, 13.2, 23.4, 13.0, 25.2]

因为单行占用更少的磁盘空间,您可以将数据块大小减少 90% 以上,同时也能加快查询速度。这节省了存储成本,并使您的查询以极快的速度运行。

本页介绍如何通过设置策略来自动将超表中的数据块从行存储转换为列存储,从而获得最佳结果。

要按照本页的步骤操作

本页中的代码示例使用

来自试用 Timescale 主要功能的数据。

列式存储中数据的压缩率和查询性能取决于数据的顺序和结构。在某个维度上发生变化的行应该彼此靠近。对于时序数据,您应按时间维度进行orderby排序。例如,Timestamp

时间戳设备 ID设备类型CPU磁盘 IO
12:00:01ASSD70.1113.4

这确保了记录以相同的顺序进行压缩和访问。但是,您总是需要使用时间维度访问数据,然后使用其他条件过滤所有行。为了使您的查询更高效,您可以根据以下条件对数据进行分段

  • 您希望访问它的方式。例如,为了快速访问单个设备的数据,您可以按Device ID列进行segmentby分段。这使您可以在列式存储中的数据上运行更快的分析查询。
  • 您希望实现的压缩率。segmentby列的基数越低,您获得的压缩效果就越好。

当 Timescale Cloud 将数据块转换为列式存储时,TimescaleDB 会自动为您的数据创建一个不同的模式。TimescaleDB 创建并使用自定义索引,以便在您向列式存储写入和读取数据时,合并 `segmentby` 和 `orderby` 参数。

设置 Hypercore 自动化

  1. 连接到您的 Timescale Cloud 服务

    Timescale Console 中打开一个 SQL 编辑器。您也可以使用 psql 连接到您的服务。

  2. 在超表上启用列式存储

    使用 CREATE TABLE 为您的时序数据创建超表。为了在列式存储数据上进行高效查询,请记住按您最常用于过滤数据的列进行segmentby分段。例如

    • 对超表使用CREATE TABLE

      CREATE TABLE crypto_ticks (
      "time" TIMESTAMPTZ,
      symbol TEXT,
      price DOUBLE PRECISION,
      day_volume NUMERIC
      ) WITH (
      tsdb.hypertable,
      tsdb.partition_column='time',
      tsdb.segmentby='symbol',
      tsdb.orderby='time DESC'
      );

      如果您自托管 TimescaleDB v2.19.3 及更早版本,请创建一个 PostgreSQL 关系表,然后使用 create_hypertable 进行转换。之后,通过调用 ALTER TABLE 来启用 Hypercore。

    • 对连续聚合使用ALTER MATERIALIZED VIEW

      ALTER MATERIALIZED VIEW assets_candlestick_daily set (
      timescaledb.enable_columnstore = true,
      timescaledb.segmentby = 'symbol' );

      在您说“嗯?”之前,需要说明的是,连续聚合是一种特殊的超表。

  3. 添加策略以在特定时间间隔将数据块转换为列式存储

    创建一个 columnstore_policy,它会在特定时间间隔自动将超表中的数据块转换为列式存储。例如,将昨天的加密货币交易数据转换为列式存储

    CALL add_columnstore_policy('crypto_ticks', after => INTERVAL '1d');

    TimescaleDB 针对列式存储中压缩数据的快速更新进行了优化。要修改列式存储中的数据,请使用标准 SQL。

  4. 检查列式存储策略

    1. 查看数据存储空间节省情况

      当您将数据转换为列式存储时,除了为分析进行优化外,数据还会被压缩 90% 以上。这有助于您节省存储成本,并使您的查询以极快的速度运行。要查看节省的空间量

      SELECT
      pg_size_pretty(before_compression_total_bytes) as before,
      pg_size_pretty(after_compression_total_bytes) as after
      FROM hypertable_columnstore_stats('crypto_ticks');

      您会看到类似以下内容

      之前之后
      194 MB24 MB
    2. 查看您设置的策略或已存在的策略

      SELECT * FROM timescaledb_information.jobs
      WHERE proc_name='policy_compression';

      请参阅 timescaledb_information.jobs

  5. 暂停列式存储策略

    SELECT * FROM timescaledb_information.jobs where
    proc_name = 'policy_compression' AND relname = 'crypto_ticks'
    -- Select the JOB_ID from the results
    SELECT alter_job(JOB_ID, scheduled => false);

    请参阅 alter_job

  6. 重启列式存储策略

    SELECT alter_job(JOB_ID, scheduled => true);

    请参阅 alter_job

  7. 移除列式存储策略

    CALL remove_columnstore_policy('crypto_ticks');

    请参阅 remove_columnstore_policy

  8. 禁用列式存储

    如果您的表在列式存储中有数据块,则必须在禁用列式存储之前将数据块转换回行式存储

    ALTER TABLE crypto_ticks SET (timescaledb.enable_columnstore = false);

    请参阅 alter_table_hypercore

Timescale Cloud 的费用基于您使用的存储量。您无需为固定存储大小付费,也无需担心随着数据增长而扩展磁盘大小——我们为您处理一切。为了进一步降低您的数据成本,请结合使用Hypercore数据保留策略分层存储

对于整数、时间戳和其他类似整数的类型,数据使用差值编码差值的差值编码simple-8b行程长度编码进行压缩。对于重复值较少的列,使用基于 XOR 的编码字典压缩。对于所有其他类型,使用字典压缩

关键词

本页有问题?报告问题 或在 GitHub 上编辑此页