Непрерывное агрегирование

В этом документе описывается функция непрерывного агрегирования в YMatrix.

1. Введение

На практике агрегирующие запросы встречаются очень часто. Поскольку такие запросы, как правило, обрабатывают базовые наборы данных большого объёма, выполняя суммирование, группировку и агрегацию, они обычно считаются относительно ресурсоёмкими и чаще всего используются в аналитических сценариях. Кроме того, частота выполнения агрегирующих запросов на практике постоянно растёт, а требования к времени их ответа становятся всё выше.

Непрерывное агрегирование — это механизм, позволяющий быстро отвечать на агрегирующие запросы. После создания непрерывного агрегирования система автоматически выполняет агрегацию исходных данных в режиме реального времени в процессе записи данных. Поскольку этот процесс синхронизирован на уровне транзакций с данными исходной таблицы, рекомендуется напрямую запрашивать данные из представления непрерывного агрегирования.

2. Использование

2.1 Создание расширения

Для непрерывного агрегирования требуется расширение matrixts. Сначала создайте расширение:

=# CREATE EXTENSION matrixts;

2.2 Создание таблицы данных

Таблица данных — это исходная таблица с данными:

=# CREATE TABLE metrics(
   time timestamp,
   tag_id int,
   sensor float4
   )
   USING MARS3
   DISTRIBUTED BY (tag_id)
   ORDER BY (time,tag_id);

2.3 Создание представления непрерывного агрегирования

Непрерывное агрегирование использует материализованные представления для хранения результатов агрегации. При создании представления необходимо использовать ключевое слово WITH (CONTINUOUS) и оператор агрегации:

=# CREATE VIEW cv1 WITH (CONTINUOUS) AS
    SELECT tag_id, COUNT(*), SUM(sensor)
    FROM metrics GROUP BY tag_id;

2.4 Вставка данных в исходную таблицу

=# INSERT INTO metrics VALUES(NOW(), 1, 1.1);
=# INSERT INTO metrics VALUES(NOW(), 1, 1.2);
=# INSERT INTO metrics VALUES(NOW(), 2, 2.1);
=# INSERT INTO metrics VALUES(NOW(), 2, 2.2);

2.5 Запрос к представлению непрерывного агрегирования

При использовании непрерывного агрегирования достаточно просто вставлять последовательные во времени данные в исходную таблицу — материализованное представление будет автоматически вычислять результат:

=# SELECT * FROM cv1 ORDER BY tag_id;
 tag_id | count |    sum
-------+-------+---------------
      1 |     2 | 2.3000002
      2 |     2 |       4.3
(2 rows)

Результаты материализованного представления совпадают с результатами агрегации по исходной таблице:

=# SELECT tag_id, COUNT(*), SUM(sensor)
    FROM metrics
    GROUP BY tag_id
    ORDER BY tag_id;
 tag_id | count |    sum
-------+-------+---------------
      1 |     2 | 2.3000002
      2 |     2 |       4.3
(2 rows)

Если при создании непрерывного агрегирования в исходной таблице уже есть данные, по умолчанию они также будут синхронизированы. Если синхронизация не требуется, параметр POPULATE нужно вручную установить в значение false при создании представления (по умолчанию используется значение true):

=# CREATE VIEW cv1 WITH (CONTINUOUS, POPULATE=false) AS
    SELECT tag_id, COUNT(*), SUM(sensor)
    FROM metrics GROUP BY tag_id;

3. Методы обслуживания

YMatrix предоставляет пользовательские функции (UDF) для обслуживания непрерывного агрегирования:

  • matrixts_internal.analyze_continuous_view(rel REGCLASS)

    Выполнение ANALYZE над материализованным представлением позволяет обновить статистическую информацию, что способствует более эффективным расчётам оптимизатора: SELECT matrixts_internal.analyze_continuous_view('cv1');

  • matrixts_internal.vacuum_continuous_view(rel REGCLASS, full BOOL)

    VACUUM над материализованным представлением очищает "мёртвые" кортежи и освобождает пространство; если второй параметр равен true, файл таблицы будет перестроен, что приведёт к уменьшению занимаемого места: SELECT matrixts_internal.vacuum_continuous_view('cv1', true);

  • matrixts_internal.rebuild_continuous_view(rel REGCLASS)

    Перестройка материализованного представления подходит для случаев, когда в исходной таблице происходят обновления или удаления, и требуется полная синхронизация данных: SELECT matrixts_internal.rebuild_continuous_view('cv1');

4. Часто задаваемые вопросы

  1. Происходит ли синхронизация данных материализованного представления с исходной таблицей в реальном времени?

    • Да, после вставки данных в исходную таблицу они сразу доступны для запроса из материализованного представления.
  2. Обеспечивает ли непрерывное агрегирование ACID (Атомарность, Согласованность, Изолированность, Долговечность)?

    • Да, данные в материализованном представлении используют тот же идентификатор транзакции, что и данные в исходной таблице.
  3. Как обрабатываются операции обновления и удаления?

    • Операции обновления, удаления и DROP исходной таблицы не отражаются в представлении непрерывного агрегирования, однако поддерживаются upsert-обновления и агрегация последнего непустого значения (last_not_null).
  4. Работает ли непрерывное агрегирование с оконными функциями?

    • Оконные функции пока не поддерживаются.
  5. Поддерживает ли непрерывное агрегирование секционированные таблицы?

    • Поддерживает.
  6. Поддерживает ли непрерывное агрегирование агрегацию по нескольким таблицам?

    • Не поддерживает.
  7. Можно ли определить несколько непрерывных агрегаций для одной таблицы?

    • Да, можно.