@infirmitive

Как агрегировать биржевые свечи через timescaledb?

Пилю диплом по рыночным данным и встала задача отображать биржевые свечи. Есть установленная 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 впервый раз использую и доку еще не всю прочитал, но скоро защита и уже нет времени читать всё заново.
  • Вопрос задан
  • 99 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы