回填数据时,您将数据插入到已经压缩的块中。从 2.10 版本开始,通过直接在压缩块上运行插入命令,此过程得到了极大简化。在执行批量回填时,建议暂停压缩作业直到完成,这样策略就不会压缩您正在处理的块。

本节包含批量回填的步骤,将引导您完成以下步骤

  1. 临时关闭任何现有的压缩策略。这将阻止策略尝试压缩您当前正在处理的块。
  2. 执行插入或回填。
  3. 重新启用压缩策略。这将重新压缩您处理过的块。

注意事项

  • 仅在 2.11 及更高版本中支持使用唯一约束回填压缩块。
  • 为了回填数据并强制执行唯一约束,我们可能会最终解压缩一些数据。如果我们要回填大量数据,手动解压缩您正在处理的块(如以下“手动回填”部分所示)可能性能更高。

为了使回填更容易,您可以使用 TimescaleDB extras GitHub 存储库中的回填函数。特别是,decompress_backfill 过程会为您自动执行许多回填步骤。

注意

本节将向您展示如何使用临时表进行批量回填数据。临时表仅在数据库会话期间存在,然后会自动删除。如果您定期回填,您可能更愿意使用常规表,这样多个写入器可以同时插入到表中。在这种情况下,在您完成数据回填后,通过截断您的表进行清理,为下一次回填做好准备。

  1. 在 psql 提示符下,创建一个与您要回填的超表具有相同架构的临时表。在此示例中,表名为 example,临时表名为 cpu_temp

    CREATE TEMPORARY TABLE cpu_temp AS SELECT * FROM example WITH NO DATA;
  2. 将您的数据插入到临时表中。

  3. 调用 decompress_backfill 过程。此过程会停止压缩策略,识别回填数据对应的压缩块,解压缩块,将回填表中的数据插入到主超表中,然后重新启用压缩策略

    CALL decompress_backfill(
    staging_table=>'cpu_temp', destination_hypertable=>'example'
    );

如果您不想使用提供的函数,您可以手动执行这些步骤。

  1. 在 psql 提示符下,找到策略的 job_id

    SELECT j.job_id
    FROM timescaledb_information.jobs j
    WHERE j.proc_name = 'policy_compression'
    AND j.hypertable_name = <target table>;
  2. 暂停压缩,以防止策略尝试压缩您当前正在处理的块

    SELECT alter_job(<job_id>, scheduled => false);
  3. 解压缩您要修改的块。

    SELECT decompress_chunk('_timescaledb_internal._hyper_2_2_chunk');

    对每个块重复此操作。或者,您可以使用 show_chunks 根据时间范围解压缩一组块

    SELECT decompress_chunk(i)
    FROM show_chunks('conditions', newer_than, older_than) i;
  4. 当您解压缩完所有要修改的块后,执行 INSERTUPDATE 命令来回填数据。

  5. 重新启动压缩策略作业。下次作业运行时,它会重新压缩任何已解压缩的块。

    SELECT alter_job(<job_id>, scheduled => true);

    或者,要立即重新压缩块,请使用 run_job 命令

    CALL run_job(<job_id>);

关键词

发现此页面有错误?报告错误 或 在 GitHub 上编辑此页面