在大多数情况下,自动压缩策略 足以自动压缩您的数据块。但是,如果您想要更好地控制压缩,您也可以手动压缩特定的数据块。

在开始之前,您需要一个要压缩的数据块列表。在本示例中,我们使用一个名为 example 的超表,并压缩早于三天的的数据块。

  1. 在 psql 提示符下,选择表 example 中所有早于三天的数据块

    SELECT show_chunks('example', older_than => INTERVAL '3 days');
  2. 这将返回一个数据块列表。请记下数据块的名称

    ||show_chunks|
    |---|---|
    |1|_timescaledb_internal_hyper_1_2_chunk|
    |2|_timescaledb_internal_hyper_1_3_chunk|

当您对数据块列表感到满意时,可以使用数据块名称手动压缩每个数据块。

  1. 在 psql 提示符下,压缩数据块

    SELECT compress_chunk( '<chunk_name>');
  2. 使用此命令检查压缩结果

    SELECT *
    FROM chunk_compression_stats('example');

    结果显示给定超表的数据块、其压缩状态以及其他一些统计信息

    |chunk_schema|chunk_name|compression_status|before_compression_table_bytes|before_compression_index_bytes|before_compression_toast_bytes|before_compression_total_bytes|after_compression_table_bytes|after_compression_index_bytes|after_compression_toast_bytes|after_compression_total_bytes|node_name|
    |---|---|---|---|---|---|---|---|---|---|---|---|
    |_timescaledb_internal|_hyper_1_1_chunk|Compressed|8192 bytes|16 kB|8192 bytes|32 kB|8192 bytes|16 kB|8192 bytes|32 kB||
    |_timescaledb_internal|_hyper_1_20_chunk|Uncompressed||||||||||
  3. 对所有要压缩的数据块重复此操作。

或者,您可以使用 show_chunks 命令的输出选择数据块并在单个命令中压缩它们。例如,使用此命令压缩一到三周之间的数据块(如果它们尚未压缩)

SELECT compress_chunk(i, if_not_compressed => true)
FROM show_chunks(
'example',
now()::timestamp - INTERVAL '1 week',
now()::timestamp - INTERVAL '3 weeks'
) i;

在 Timescale 2.9 及更高版本中,您可以将多个未压缩的数据块汇总到先前压缩的数据块中,作为压缩过程的一部分。这使您可以拥有更小的未压缩数据块间隔,从而减少未压缩数据占用的磁盘空间。例如,如果您的数据中有多个较小的未压缩数据块,则可以将它们汇总到单个压缩数据块中。

要将未压缩的数据块汇总到压缩数据块中,请更改压缩设置以设置压缩数据块时间间隔,并在压缩时运行压缩操作以汇总数据块。

注意

compress_orderby 的默认设置为 'time DESC'(降序或 DESC 命令用于按升序对返回的数据进行排序),这会导致数据块在汇总期间被多次重新压缩,可能导致严重的性能损失。设置 timescaledb.compress_orderby = 'time ASC' 以避免此性能损失。

ALTER TABLE example SET (timescaledb.compress_chunk_time_interval = '<time_interval>',
timescaledb.compress_orderby = 'time ASC');
SELECT compress_chunk(c, if_not_compressed => true)
FROM show_chunks(
'example',
now()::timestamp - INTERVAL '1 week'
) c;

您选择的时间间隔必须是未压缩数据块间隔的倍数。例如,如果您的未压缩数据块间隔为一周,则压缩数据块的 <time_interval> 可以是两周或六周,但不能是一个月。

关键词

在此页面上发现问题了吗?报告问题 或 在 GitHub 上编辑此页面