Задать вопрос
@tttttv

Как с помощью TimescaleDB реализовать выгрузку последних данных с разбивкой по устройствам?

На проекте используем TimescaleDB, чтобы хранить координаты с GPS-трекеров. Есть задача - выгружать последние координаты по нескольким устройствам. Сейчас делаем запросом

SELECT distinct on (imei) * FROM locations WHERE imei IN (" + imeis_list + ") order by imei, dt desc


Возникла проблема - при выгрузке последней записи по нескольким imei (айди устройства), запрос не выполняется, долго грузит ответ

SELECT distinct on (imei) * FROM locations WHERE imei IN (867232054978268, 867232054981213, 867232054981015, 867232054980538, 867232054980157, 867232054977989, 867232054978367, 867232054978003, 867232054980769, 867232054981296, 867232054981411, 867232054978102, 867232054978235, 867232054977864, 867232054978664, 867232054980173, 867232054981544, 867232054980835, 867232054978474, 867232054976544, 867232054980876) order by imei, dt desc;


Но если запросить те же координаты тремя разными запросами (в каждом только часть имеев), то запрос выполняется практически моментально.

Вот как задается таблица в самом TimescaleDB:

CREATE TABLE locations (id SERIAL PRIMARY KEY, imei BIGINT, dt TIMESTAMP, lat REAL, long REAL, las BOOL, los BOOL, velocity INT, course INT, data VARBIT(128));
SELECT create_hypertable('locations','dt');
CREATE INDEX ix_imei_time ON locations (imei, dt DESC);


Где можем ошибаться? Сейчас в таблице 4.5M записей.
  • Вопрос задан
  • 106 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
А попробуй убери из индекса дату.

CREATE INDEX ix_imei_time ON locations (imei);

Я не работал с TimescaleDB но вообще работать со вторичными индексами в time-series - это плохая тема.
Лучше выбрать лидирующий партишен как дата. И вторичный партишен как хеш от какого-то интересующего
атрибута или группы атрибутов. И тогда оптимизатор пойдет просто в тот фасет который соотвествует нужному
пересечению партишенов.
Ответ написан
Ваш ответ на вопрос

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

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