问题描述
我有一个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_siblings
和commit_delay
;这也将减少WAL刷新的次数。 -
使用准备好的语句。对于单行插入,计划时间将很长。
-
不要使用未记录的表,除非您不介意崩溃后是否丢失了数据。
-
不要禁用自动真空。
-
增加
max_wal_size
可获得的检查点不会超过正常情况。