Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Расширение кластера
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Конфигурация
Справочник по SQL
Часто задаваемые вопросы
В этом документе описывается функция непрерывного агрегирования в YMatrix.
На практике агрегирующие запросы встречаются очень часто. Поскольку такие запросы, как правило, обрабатывают базовые наборы данных большого объёма, выполняя суммирование, группировку и агрегацию, они обычно считаются относительно ресурсоёмкими и чаще всего используются в аналитических сценариях. Кроме того, частота выполнения агрегирующих запросов на практике постоянно растёт, а требования к времени их ответа становятся всё выше.
Непрерывное агрегирование — это механизм, позволяющий быстро отвечать на агрегирующие запросы. После создания непрерывного агрегирования система автоматически выполняет агрегацию исходных данных в режиме реального времени в процессе записи данных. Поскольку этот процесс синхронизирован на уровне транзакций с данными исходной таблицы, рекомендуется напрямую запрашивать данные из представления непрерывного агрегирования.
Для непрерывного агрегирования требуется расширение matrixts. Сначала создайте расширение:
=# CREATE EXTENSION matrixts;
Таблица данных — это исходная таблица с данными:
=# CREATE TABLE metrics(
time timestamp,
tag_id int,
sensor float4
)
USING MARS3
DISTRIBUTED BY (tag_id)
ORDER BY (time,tag_id);
Непрерывное агрегирование использует материализованные представления для хранения результатов агрегации. При создании представления необходимо использовать ключевое слово WITH (CONTINUOUS) и оператор агрегации:
=# CREATE VIEW cv1 WITH (CONTINUOUS) AS
SELECT tag_id, COUNT(*), SUM(sensor)
FROM metrics GROUP BY tag_id;
=# 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);
При использовании непрерывного агрегирования достаточно просто вставлять последовательные во времени данные в исходную таблицу — материализованное представление будет автоматически вычислять результат:
=# 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;
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');
Происходит ли синхронизация данных материализованного представления с исходной таблицей в реальном времени?
Обеспечивает ли непрерывное агрегирование ACID (Атомарность, Согласованность, Изолированность, Долговечность)?
Как обрабатываются операции обновления и удаления?
Работает ли непрерывное агрегирование с оконными функциями?
Поддерживает ли непрерывное агрегирование секционированные таблицы?
Поддерживает ли непрерывное агрегирование агрегацию по нескольким таблицам?
Можно ли определить несколько непрерывных агрегаций для одной таблицы?