在比较 postgres 和 timescaledb 之间的插入性能时,timescaledb 的表现不太好?

ank*_*itj 1 postgresql timescaledb

我尝试了插入查询性能测试。以下是数字:-

Postgres

插入:100 万行的 10 次插入的平均执行时间:6260 毫秒

时间尺度

插入:100 万行的 10 次插入的平均执行时间:10778 毫秒

插入查询:

-- Testing SQL Queries

--Join table

CREATE TABLE public.sensors(
  id SERIAL PRIMARY KEY,
  type VARCHAR(50),
  location VARCHAR(50)
);


-- Postgres table
CREATE TABLE sensor_data (
  time TIMESTAMPTZ NOT NULL,
  sensor_id INTEGER,
  temperature DOUBLE PRECISION,
  cpu DOUBLE PRECISION,
  FOREIGN KEY (sensor_id) REFERENCES sensors (id)
);

CREATE INDEX idx_sensor_id
ON sensor_data(sensor_id);

-- TimescaleDB table
CREATE TABLE sensor_data_ts (
  time TIMESTAMPTZ NOT NULL,
      sensor_id INTEGER,
  temperature DOUBLE PRECISION,
  cpu DOUBLE PRECISION,
  FOREIGN KEY (sensor_id) REFERENCES sensors (id)
);
SELECT create_hypertable('sensor_data_ts', 'time');

    
-- Insert Data

INSERT INTO sensors (type, location) VALUES
('a','floor'),
('a', 'ceiling'),
('b','floor'),
('b', 'ceiling');


-- Postgres 
EXPLAIN ANALYSE
INSERT INTO sensor_data (time, sensor_id, cpu, temperature)
SELECT
  time,
  sensor_id,
  random() AS cpu,
  random()*100 AS temperature
FROM generate_series(now() - interval '125 week', now(), interval '5 minute') AS g1(time), generate_series(1,4,1) AS g2(sensor_id); 


-- TimescaleDB
EXPLAIN ANALYSE
INSERT INTO sensor_data_ts (time, sensor_id, cpu, temperature)
SELECT
  time,
  sensor_id,
  random() AS cpu,
  random()*100 AS temperature
FROM generate_series(now() - interval '125 week', now(), interval '5 minute') AS g1(time), generate_series(1,4,1) AS g2(sensor_id);
Run Code Online (Sandbox Code Playgroud)

我是否忽略了任何优化?

Mik*_*man 5

默认情况下,超表每周创建一个块(可在调用中配置create_hypertable)。因此,通过上述设置,您为 TimescaleDB 创建了 125 个块,每个块有 8000 行。创建块以及处理此块的逻辑都会产生开销。因此,由于数据集如此之小,您会看到此块创建的开销,通常会分摊到更大的数据集上:在大多数“自然”设置中,我们通常会看到数百万+(或至少 100,000 秒)的数量级) 每个块的行数。

当数据集(特别是您当前维护的索引)自然不适合内存时,您就会开始看到 TimescaleDB 等分区架构与单表之间的插入性能差异。

在上面的例子中,1M 行很容易放入内存,并且普通 PG 表上的唯一索引是sensor_id,所以它非常小。(在 TimescaleDB 超表上,默认情况下,您在时间戳上有索引,每个块都不同,因此您实际上有 125 个索引,每个索引的大小为 8000,给定不同的时间戳)。

对于视觉效果,请参阅这篇较旧的博客文章: https://blog.timescale.com/blog/time-series-data-why-and-how-to-use-a-relational-database-instead-of-nosql-d0cd6975e87c /#结果插入率提高 15 倍

注意,对单个 PG 表的插入一开始是相同的,但随着表变大并且数据/索引开始交换到磁盘,插入量会下降。

如果您想做更大的性能测试,可能建议尝试时间序列基准套件: https: //github.com/timescale/tsbs