У меня довольно распространенный временной ряд:
- Hypertable TimescaleDB ( data ), отслеживающий некоторые метрики с течением времени. Столбцы: метка времени, идентификатор, метрика.
- Hypertable имеет таблицу непрерывного агрегирования ( aggregated_data ), которая агрегирует метрику на почасовой основе, сохраняя несколько статистических значений (avg, min, max).
- Пользователю будут показаны только агрегированные показатели
Я хотел бы представить возможность ручной консолидации метрик (например, редактировать выбросы, заполнять пробелы, ...). Эти сводные значения будут затем показаны пользователю вместе с измеренными показателями.
Каков TimescaleDB способ достичь этого?
Вот что я придумал:
- Создание обычной таблицы ( консолидированных_данных ) для консолидированных данных вручную
- Эта таблица будет иметь те же столбцы, что и aggregated_data view
- Затем я объединил бы эти две таблицы и добавил бы SQL, чтобы избежать дублирования, идентифицировал консолидированные данные, ...
В этом случае операция UNION будет выглядеть примерно так (я на самом деле не выполнял / не проверял этот оператор):
SELECT DISTINCT timestamp, identifier FROM (
SELECT timestamp, identifier, metric, true as consolidated FROM consolidated_data WHERE timestamp > NOW() - interval '7 days'
UNION ALL
SELECT timestamp, identifier, metric, false as consolidated FROM aggregated_data WHERE timestamp > NOW() - interval '7 days'
)
ORDER BY timestamp;
Я бы ожидал, что этот подход сработает, однако еще много неизвестных:
- Должна ли консолидированная таблица быть Hypertable? Это ускорит операцию UNION?
- Должен ли я предпочесть MERGE?
- Есть ли более умный способ с инструментами и утилитами, о которых я еще не знаю?