Постоянная агрегация

В этом документе описывается функция непрерывной агрегации в 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 нужно вручную установить в значение true при создании представления (по умолчанию установлено значение false):

=# 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. Можно ли определить несколько непрерывных агрегаций для одной таблицы?

    • Да, можно.
  8. Будут ли по умолчанию заданы параметры сжатия для непрерывной агрегации?

    • Нет, не будут.