Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Конфигурация
Индексы
Расширения
Справочник по 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 нужно вручную установить в значение true при создании представления (по умолчанию установлено значение false):
=# 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 (Атомарность, Согласованность, Изолированность, Долговечность)?
Как обрабатываются операции обновления и удаления?
Поддерживаются ли оконные функции в непрерывной агрегации?
Поддерживает ли непрерывная агрегация секционированные таблицы?
Поддерживает ли непрерывная агрегация агрегацию по нескольким таблицам?
Можно ли определить несколько непрерывных агрегаций для одной таблицы?
Будут ли по умолчанию заданы параметры сжатия для непрерывной агрегации?