【问题标题】:TimescaleDB slower than plain postgresql 10 for insertTimescaleDB 比用于插入的普通 postgresql 10 慢
【发布时间】:2020-02-01 12:12:13
【问题描述】:

我正在使用 JDBC 将 1m 行插入到具有时间刻度的测试表中,性能似乎是普通 postgresql 的一半。通过采用 timescale-tune 实用程序建议的所有值来完成时间刻度调整。我做错了什么?

   private static void writeTable(String sql, int count, int commitCount,
   Connection conn) throws Exception
   {
       conn.setAutoCommit(false);
       long start = System.currentTimeMillis();
       long t = start;
       PreparedStatement stmt = conn.prepareStatement(sql);
       for(int i = 0; i < count; i++)
       {
           stmt.setTimestamp(1, new Timestamp(t));
           stmt.setDouble(2, 10.9);
           stmt.addBatch();
           t ++;
           if(commitCount != -1 && ((i + 1) % commitCount) == 0)
           {
               stmt.executeBatch();
               conn.commit();
           }
       }
       stmt.executeBatch();
       stmt.close();
       conn.commit();
       conn.close();
       long diff = System.currentTimeMillis() - start;
       System.out.println("Count      : " + count);
       System.out.println("Total Time : " + diff);
       System.out.println("Writes/Sec : " + ((count * 1000) / diff));
   }
Query: INSERT INTO kt_device_info (di_device_id, di_time, di_value) VALUES (1,?,?)
Table:
CREATE TABLE kt_device (
    id              BIGINT PRIMARY KEY,
    d_name          TEXT
);

insert into kt_device(id, d_name) values (1, 'dev-1');

CREATE TABLE kt_device_info (
    di_device_id    BIGINT REFERENCES  kt_device NOT NULL,
    di_time         TIMESTAMPTZ NOT NULL,
    di_value        DOUBLE PRECISION  NULL
);

SELECT create_hypertable('kt_device_info', 'di_time');

时间尺度: 计数:1000000 总时间:42026 每秒写入次数:23794

Postgres 10: 计数:1000000 总时间:22573 每秒写入次数:44300

x86_64-pc-linux-gnu 上的 PostgreSQL 10.10 (Ubuntu 10.10-1.pgdg16.04+1),由 gcc 编译 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609, 64-bit

timescaledb | 1.4.2 |公共 |为时间序列数据启用可扩展的插入和复杂查询

硬件: Intel(R) Core(TM) i7-4702MQ CPU @ 2.20GHz,16GB 内存

Chunks:
SELECT show_chunks('kt_device_info');
              show_chunks               
----------------------------------------
 _timescaledb_internal._hyper_7_7_chunk
(1 row)

【问题讨论】:

  • 使用perf查看时间花在哪个可执行文件的哪个函数上。您需要安装调试符号。
  • 在 TimescaleDB 中,具有正确大小的块很重要。您能否检查并添加到问题中创建了多少块?创建许多块会对性能产生负面影响。

标签: java postgresql jdbc timescaledb


【解决方案1】:

查看您的代码,您正在创建相隔几毫秒的时间戳。这可以解释为什么你只有一大块。默认块大小为 7 天。在这种情况下,您可能希望将分区设置为更小几秒钟。您可以使用以下方法更改块大小: SELECT set_chunk_time_interval('kt_device_info', 4000);

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2012-07-29
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2014-01-10
    相关资源
    最近更新 更多