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