TimescaleDB медленнее, чем обычный postgresql 10 для вставки - PullRequest
0 голосов
/ 03 октября 2019

Я вставляю строки длиной 1 м в тестовую таблицу со шкалой времени, используя JDBC, и производительность кажется примерно вдвое меньше, чем у обычного postgresql. Настройка шкалы времени была выполнена с использованием всех значений, предложенных утилитой настройки шкалы времени. Что я делаю не так?

   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

PostgreSQL 10.10 (Ubuntu 10.10-1.pgdg16.04 + 1)на x86_64-pc-linux-gnu, скомпилированный gcc (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.11) 5.4.0 20160609, 64-битный

timescaledb |1.4.2 |общественность |Обеспечивает масштабируемые вставки и сложные запросы для данных временных рядов

Аппаратное обеспечение: Intel® Core (TM) i7-4702MQ CPU @ 2,20 ГГц, 16 ГБ памяти

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

1 Ответ

0 голосов
/ 04 октября 2019

Глядя на свой код, вы создаете временные метки с интервалом в миллисекунды. Это объясняет, почему у вас есть только один кусок. Размер чанка по умолчанию составляет 7 дней. В этом случае вы, вероятно, захотите уменьшить размер разделов на несколько секунд. Вы можете изменить размер чанка с помощью: SELECT set_chunk_time_interval ('kt_device_info', 4000);

...