Как эффективно получить последнюю временную метку для каждого актива без последовательного сканирования на timescaledb? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть таблица

| Asset |   timestamp   | open | high | low | close | volume |
|-------|---------------|------|------|-----|-------|--------|
| AAPL  | 1551274920000 | 200  | 300  | 200 | 250   | 10240  |
| AAPL  | 1551274980000 | 201.4| 299.5| 200 | 244.5 | 11871  |
| GOOG  | 1551274980000 | 471.2| 488.2|464.6| 474.84| 5476.58|

Как получить последнюю метку времени для каждого актива.Вот то, что я пробовал до сих пор

Подход 1

SELECT symbol, max(ts) from ohlc_60 group by symbol;

This seems to scan all the chunks
explain select symbol, max(ts) from ohlc_60 group by symbol;
                                      QUERY PLAN                                      
--------------------------------------------------------------------------------------
 HashAggregate  (cost=1199.37..1201.37 rows=200 width=16)
   Group Key: ohlc_60.symbol
   ->  Append  (cost=0.00..1014.27 rows=37019 width=16)
         ->  Seq Scan on binance_ohlc_60  (cost=0.00..0.00 rows=1 width=40)
         ->  Seq Scan on _hyper_67_199_chunk  (cost=0.00..197.81 rows=8681 width=15)
         ->  Seq Scan on _hyper_67_200_chunk  (cost=0.00..284.32 rows=13032 width=15)
         ->  Seq Scan on _hyper_67_201_chunk  (cost=0.00..281.14 rows=12414 width=15)
         ->  Seq Scan on _hyper_67_202_chunk  (cost=0.00..48.41 rows=2141 width=15)
         ->  Seq Scan on _hyper_67_203_chunk  (cost=0.00..17.50 rows=750 width=40)
(9 rows)

В настоящее время я сохраняю данные по 1м в чанках по 1 часу, но, вероятно, превратить их в чанки за 1 день.Мне нужно получить последнюю временную метку каждого актива без последовательного сканирования. Какие-либо предложения очень ценятся?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Ваш запрос должен получить пользу от следующего индекса:

CREATE INDEX idx ON ohlc_60 (symbol, ts);

Причина, по которой это должно работать, заключается в том, что вы запрашиваете максимальное значение метки времени для каждой группы symbol.Это можно легко получить из сканирования B-дерева.

0 голосов
/ 01 марта 2019

Запрос последней точки из документации TimescaleDB:

https://docs.timescale.com/v1.2/using-timescaledb/reading-data#last-point

0 голосов
/ 28 февраля 2019

используйте связанный подзапрос

select t1.* from table_name t1
where t1.timestamp=(select max(timestamp) from table_name t2 where t2.Asset=t1.Asset)

А для ускорения сканирования вам нужно адаптировать индексирование в соответствующем столбце, который уже был предложен в другом ответе @Tim

...