回填数据时,您将数据插入到已经压缩的块中。从 2.10 版本开始,通过直接在压缩块上运行插入命令,此过程得到了极大简化。在执行批量回填时,建议暂停压缩作业直到完成,这样策略就不会压缩您正在处理的块。
本节包含批量回填的步骤,将引导您完成以下步骤
- 临时关闭任何现有的压缩策略。这将阻止策略尝试压缩您当前正在处理的块。
- 执行插入或回填。
- 重新启用压缩策略。这将重新压缩您处理过的块。
注意事项
- 仅在 2.11 及更高版本中支持使用唯一约束回填压缩块。
- 为了回填数据并强制执行唯一约束,我们可能会最终解压缩一些数据。如果我们要回填大量数据,手动解压缩您正在处理的块(如以下“手动回填”部分所示)可能性能更高。
为了使回填更容易,您可以使用 TimescaleDB extras GitHub 存储库中的回填函数。特别是,decompress_backfill
过程会为您自动执行许多回填步骤。
注意
本节将向您展示如何使用临时表进行批量回填数据。临时表仅在数据库会话期间存在,然后会自动删除。如果您定期回填,您可能更愿意使用常规表,这样多个写入器可以同时插入到表中。在这种情况下,在您完成数据回填后,通过截断您的表进行清理,为下一次回填做好准备。
在 psql 提示符下,创建一个与您要回填的超表具有相同架构的临时表。在此示例中,表名为
example
,临时表名为cpu_temp
CREATE TEMPORARY TABLE cpu_temp AS SELECT * FROM example WITH NO DATA;将您的数据插入到临时表中。
调用
decompress_backfill
过程。此过程会停止压缩策略,识别回填数据对应的压缩块,解压缩块,将回填表中的数据插入到主超表中,然后重新启用压缩策略CALL decompress_backfill(staging_table=>'cpu_temp', destination_hypertable=>'example');
如果您不想使用提供的函数,您可以手动执行这些步骤。
在 psql 提示符下,找到策略的
job_id
SELECT j.job_idFROM timescaledb_information.jobs jWHERE j.proc_name = 'policy_compression'AND j.hypertable_name = <target table>;暂停压缩,以防止策略尝试压缩您当前正在处理的块
SELECT alter_job(<job_id>, scheduled => false);解压缩您要修改的块。
SELECT decompress_chunk('_timescaledb_internal._hyper_2_2_chunk');对每个块重复此操作。或者,您可以使用
show_chunks
根据时间范围解压缩一组块SELECT decompress_chunk(i)FROM show_chunks('conditions', newer_than, older_than) i;当您解压缩完所有要修改的块后,执行
INSERT
或UPDATE
命令来回填数据。重新启动压缩策略作业。下次作业运行时,它会重新压缩任何已解压缩的块。
SELECT alter_job(<job_id>, scheduled => true);或者,要立即重新压缩块,请使用
run_job
命令CALL run_job(<job_id>);
关键词
发现此页面有错误?报告错误 或 在 GitHub 上编辑此页面。