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

1. Введение

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

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

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

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

Для постоянной агрегации требуется расширение matrixts. Сначала необходимо создать это расширение:

CREATE EXTENSION matrixts;

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

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

CREATE TABLE metrics(
    time timestamp,
    tag_id int,
    sensor float4
)
Distributed by(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. Можно ли определить несколько постоянных агрегаций для одной таблицы?

    • Да, можно.