Timescale-减压块
环境:
PostgreSQL数据库
V2.x版本
减压
如果您需要在压缩块中回填或更新数据,您应该先解压缩该块。将数据插入压缩块比将数据插入未压缩块更费时费力,因此,如果您需要回填大量数据,那么减压该块也是一个好主意。
注意: 在规划压缩策略时,如果需要,请确保留出足够的额外存储容量用于减压块 。
这些是解压块准备插入或回填数据的主要步骤:
- 暂时关闭任何现有的压缩策略。这可以阻止策略尝试压缩您当前正在处理的块。
- 解压块。
- 执行插入或回填。
- 重新启用压缩策略。这将重新压缩您工作的块。
手动减压块
1.解压缩单个块
要按名称解压缩单个块,请运行此命令:
SELECT decompress_chunk('chunk_name');
2.按时间减压块
要根据时间范围解压缩一组块,您可以使用输出来解压缩每个块:
SELECT decompress_chunk(i)
from show_chunks('table_name',newer_than,older_than) i;
3.在更精确的约束下解压缩块
SELECT tableoid::regclass FROM metrics
WHERE time = '2000-01-01' AND device_id = 1
GROUP BY tableoid;
tableoid
------------------------------------------
_timescaledb_internal._hyper_72_37_chunk
反填充压缩块的历史数据
当您回填数据时,您正在将过去具有时间戳的数据插入到已经压缩的相应块中。
在本节中,我们解释如何将数据反填到临时表中。临时表仅在数据库会话期间存在,然后自动丢弃,这是执行大型回填操作的最简单方法。
如果您定期回填,您可能更喜欢使用常规表,以便多个编写器可以在流程之前同时插入表中。在这种情况下,在完成数据回填后,通过截断表以准备下一个回填进行清理,或将其完全丢弃。
背填与提供的功能
1.在 psql 提示下,创建一个临时表,其模式与您想要回填的超表相同。在此示例中,我们的表称为"数据",数据列为:
CREATE TEMPORARY TABLE cpu_temp AS SELECT * FROM example WITH NO DATA;
2.将数据插入回填表。
3.使用提供的回填功能。此功能停止压缩策略,识别回填数据对应的压缩块,减压块,将背填表中的数据插入主超表,然后重新启用压缩策略
CALL decompress_backfill(staging_table=>'cpu_temp', destination_hypertable=>'example');
手动回填
1.在psql提示下,找到策略:job_id
SELECT s.job_id
FROM timescaledb_information.jobs j
INNER JOIN timescaledb_information.job_stats s ON j.job_id = s.job_id
WHERE j.proc_name = 'policy_compression' AND s.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.当您解压缩了要修改的所有块时,执行或命令以回填数据。INSERT UPDATE
5.重新启动压缩策略工作。下次工作运行时,它会重新压缩任何被减压的块。
SELECT alter_job(<job_id>, scheduled => true);
或者,要立即重新压缩块,请使用命令:run_job
CALL run_job(<job_id>);