PostgreSQL和TimescaleDB的高速单行插入

问题描述

我有一个TSDB Hypertable的情况,看起来像这样:

CREATE TABLE data (
  pool_id INTEGER NOT NULL,ts TIMESTAMP NOT NULL,noise_err DECIMAL,noise_val DECIMAL,signal_err DECIMAL,signal_val DECIMAL,high_val DECIMAL,low_val DECIMAL,CONSTRAINT data_pid_fk FOREIGN KEY (pool_id) REFERENCES pools (id) ON DELETE CASCADE
);

CREATE UNIQUE INDEX data_pts_idx ON data (pool_id,ts);
SELECT create_hypertable('data','ts','pool_id',100);

大约有1000个池,data包含每个池超过1年的分钟记录,并且有很多分析查询处理最近3到5天的数据。新数据具有任意延迟:10ms至30s(取决于池)。

现在的问题是:收到新记录后,我需要尽快运行分析查询,因此我无法批量插入,并且需要加快单行插入。

我已经运行timescaledb-tune,然后关闭了同步提交(synchronous_commit = off),以unlogged表模式播放,并尝试禁用自动吸尘,这并没有多大帮助。 我获得的最佳插入时间是〜37ms,并发插入开始到110ms时性能会下降。

除了删除索引/约束之外,我还能做些什么来加快单行插入?

解决方法

首先,为什么首先将timescaledb用于此表?您从中得到的值得减缓的成果是什么?

第二,您每年有5200个分区的数据价值。这将导致无法管理的分区数量。

,

我对需要查看最新一秒钟数据的分析查询的需求表示怀疑。

无论如何,加快单行插入的方法是:

  • synchronous_commit设置为off

    但是请注意,如果发生崩溃,这意味着大约半秒的已提交事务丢失数据!如果不能接受,请使用commit_siblingscommit_delay;这也将减少WAL刷新的次数。

  • 使用准备好的语句。对于单行插入,计划时间将很长。

  • 不要使用未记录的表,除非您不介意崩溃后是否丢失了数据。

  • 不要禁用自动真空。

  • 增加max_wal_size可获得的检查点不会超过正常情况。