Непрерывная агрегация

В этом документе описана функция непрерывной агрегации в 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. Как обрабатываются операции UPDATE и DELETE?
    — Операции обновления, удаления и DROP над исходной таблицей не отражаются в представлении непрерывной агрегации. Однако поддерживаются обновления по принципу upsert и агрегатная функция last_not_null для получения последнего ненулевого значения.

  4. Поддерживает ли непрерывная агрегация оконные функции?
    — Нет, оконные функции в настоящее время не поддерживаются.

  5. Поддерживает ли непрерывная агрегация секционированные таблицы?
    — Да.

  6. Можно ли выполнять агрегацию по нескольким таблицам с помощью непрерывной агрегации?
    — Нет.

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

  8. Применяются ли параметры сжатия по умолчанию при непрерывной агрегации?
    — Нет.