Пилю диплом по рыночным данным и встала задача отображать биржевые свечи. Есть установленная postgresql 12, накатил timescaledb. Создаю таблицы:
Собственно, в data_raw таблицу залил тестовых данных за последние пару лет по нескольким тикерам и запустил тестовый клиент, который имитирует живую биржу и наполняет рандомными значениями, которые приближены к реальному поведению.
Так вот, те данные, что залил, по итогу не агрегируются почему-то, а те, что пишу тестовым клиентам (примерно 3600 записей в минуту в так называемый "пик активности") агрегируются в свечи как надо. Последние 5 минут в real-time агрегаты, а предыдущие 10 в continuous.
Проблема в том, что select свечей потом выполняется достаточно долго. Исходя из explain он перебирает кучу чанков. Даже за последней свечой ходит в чанки примерно 6-7 секунд. limit 100 где-то 7-8 секунд. Но это 5-минутные свечи, те же недельные очень долго выполняются.
Таких вью больше, просто не стал все добавлять. Хотелось бы понять правильный алгоритм использования таких агрегаций, а к остальным уже применю.
CREATE TABLE IF NOT EXISTS data_raw
(
ticktime timestamp with time zone NOT NULL,
ticker text COLLATE pg_catalog."default" NOT NULL,
board text COLLATE pg_catalog."default",
exchange text COLLATE pg_catalog."default",
price double precision,
amount bigint
);
SELECT create_hypertable('data_raw','ticktime', chunk_time_interval => INTERVAL '1 day', migrate_data := true, if_not_exists => TRUE);
-- Create views
CREATE MATERIALIZED VIEW IF NOT EXISTS candle_5m
WITH (timescaledb.continuous, timescaledb.create_group_indexes = true) AS
SELECT ticker, board, exchange,
time_bucket('5 minutes', ticktime) AS bucket,
FIRST(price, ticktime) as open,
LAST(price, ticktime) as close,
MIN(price) as low,
MAX(price) as high,
sum(amount*price) as volume
FROM data_raw
GROUP BY ticker, board, exchange, bucket;
SELECT add_continuous_aggregate_policy(
'candle_5m',
start_offset => INTERVAL '15 minutes',
end_offset => INTERVAL '5 minutes',
schedule_interval => INTERVAL '5 minutes',
if_not_exists => true
);
Подскажите, пожалуйста, что не так с агрегациями начудил. Timescale впервый раз использую и доку еще не всю прочитал, но скоро защита и уже нет времени читать всё заново.