【发布时间】:2020-11-12 21:02:40
【问题描述】:
我有一个 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 天的数据。新数据的到来有任意延迟:10 毫秒到 30 秒,具体取决于池。
现在的问题是:我需要在收到新记录后尽快运行分析查询,因此我无法批量插入,我需要加快单行插入速度。
我运行了timescaledb-tune,然后关闭了同步提交 (synchronous_commit = off),使用了unlogged 表模式,并尝试禁用自动清理,但没有多大帮助。
我得到的最佳插入时间约为 37 毫秒,当并发插入开始到 110 毫秒时会降级。
除了删除索引/约束,我还能做些什么来加快单行插入?
【问题讨论】:
-
空间分区会降低性能。使用100个分区的空间分区的原因是什么?
-
@a_horse_with_no_name 我使用的是 PG 版本 12。
-
@k_rus 的重点是在 RAM 中保留尽可能多的数据,因此所有池的最后一周始终在 RAM 中。
-
使用标准系统工具查看瓶颈在哪里。
top,sar,vmstat。另外,对 pg_stat_activity 的 wait_event 字段进行采样。
标签: postgresql performance postgresql-12 timescaledb data-ingestion