У меня есть случай с 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 мс.
Что еще, кроме удаления индексов / ограничений, я могу сделать для ускорения вставки одной строки?
top
,sar
,vmstat
. Также возьмите образец поля wait_event в pg_stat_activity. - person jjanes   schedule 14.11.2020