使用PostgreSQL&;的高速单行插入;时间刻度数据库

使用PostgreSQL&;的高速单行插入;时间刻度数据库,postgresql,performance,postgresql-12,timescaledb,data-ingestion,Postgresql,Performance,Postgresql 12,Timescaledb,Data Ingestion,我有一个TSDB超表格的案例,大致如下所示: 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 FOR

我有一个TSDB超表格的案例,大致如下所示:

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个池,
数据
包含每个池超过1年的分钟记录,以及相当多的分析查询,用于处理最后3到5天的数据。新数据以任意延迟出现:10毫秒到30秒,具体取决于池

现在的问题是:我需要在收到新记录后尽快运行分析查询,因此我不能批量插入,我需要加快单行插入的速度

我运行了
timescaledb tune
,然后关闭了同步提交(
synchronous\u commit=off
),玩了
unlocked
表格模式,并尝试禁用自动真空,但没有多大帮助。 我得到的最佳插入时间是~37毫秒,当并发插入开始到110毫秒时,时间会降低


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

首先,为什么要对该表使用timescaledb?你从中得到了什么值得减速的东西


其次,您每年有5200个分区的数据。分区数量接近无法管理。

首先,为什么要对该表使用timescaledb?你从中得到了什么值得减速的东西


其次,您每年有5200个分区的数据。分区的数量越来越接近无法管理。

我对需要查看最新数据的分析查询的要求提出质疑

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

  • 将同步提交设置为关闭

    但请注意,这意味着一旦崩溃,将丢失约半秒已提交事务的数据!如果这是不可接受的,请使用
    commit_同胞
    commit_delay
    ;这也将减少WAL刷新的次数

  • 使用事先准备好的陈述。对于单行插入,计划时间将非常重要

  • 除非您不介意崩溃后数据丢失,否则不要使用未标记的表

  • 不要禁用自动真空

  • 增加
    max\u wal\u size
    以获得不超过正常值的检查点


我对需要查看最新瞬间数据的分析查询的要求提出质疑

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

  • 将同步提交设置为关闭

    但请注意,这意味着一旦崩溃,将丢失约半秒已提交事务的数据!如果这是不可接受的,请使用
    commit_同胞
    commit_delay
    ;这也将减少WAL刷新的次数

  • 使用事先准备好的陈述。对于单行插入,计划时间将非常重要

  • 除非您不介意崩溃后数据丢失,否则不要使用未标记的表

  • 不要禁用自动真空

  • 增加
    max\u wal\u size
    以获得不超过正常值的检查点


空间分区会降低性能。使用具有100个分区的空间分区的原因是什么?@a_horse_和_no_name我使用的是PG version 12。@k_rus重点是在RAM中保留尽可能多的数据,所以所有池的最后一周总是在RAM中。使用标准系统工具查看瓶颈在哪里
top
sar
vmstat
。另外,对pg_stat_activity的wait_事件字段进行采样。空间分区会降低性能。使用具有100个分区的空间分区的原因是什么?@a_horse_和_no_name我使用的是PG version 12。@k_rus重点是在RAM中保留尽可能多的数据,所以所有池的最后一周总是在RAM中。使用标准系统工具查看瓶颈在哪里
top
sar
vmstat
。另外,对pg_stat_活动的wait_事件字段进行采样。该项目已经使用PGSQL作为主要数据库,当需要存储时间序列数据时,使用TSDB是不需要动脑筋的。没有it,单次写入与并发写入的时间长达1秒。这么多分区的意义在于将每个池的最后一周保留在RAM中。1s进行单行插入是很奇怪的。你有几百个没有告诉我们的索引吗?@Daniel“这么多分区的目的是将每个池的最后一周都保存在RAM中”池id上的分区如何帮助做到这一点?没有,该表按原样显示。我的想法是PG将在RAM中保存尽可能多的数据,所以我已经切碎了那么多数据。该项目已经使用PGSQL作为主要数据库,当需要存储时间序列数据时,使用TSDB是不需要动脑筋的。没有it,单次写入与并发写入的时间长达1秒。这么多分区的意义在于将每个池的最后一周保留在RAM中。1s进行单行插入是很奇怪的。你有几百个没有告诉我们的索引吗?@Daniel“这么多分区的目的是将每个池的最后一周都保存在RAM中”池id上的分区如何帮助做到这一点?没有,该表按原样显示。我的想法是PG在RAM中可以容纳尽可能多的数据,所以我已经切碎了这么多的数据。