Непрерывные представления
Основной абстрактной конструкцией PipelineDB является непрерывное представление. Непрерывное представление очень похоже на обычное представление, за исключением того, что оно выбирает комбинацию потоков и таблиц в качестве входных данных и инкрементально обновляется в реальном времени при записи новых данных в эти источники.
Как только строка потока читается непрерывными представлениями, которые должны ее прочитать, она удаляется. Сырые, детальные данные не хранятся нигде. Единственные данные, которые сохраняются для непрерывного представления, - те, что возвращаются при выполнении SELECT * FROM that_view
. Таким образом, можно рассматривать непрерывное представление как очень производительное материализованное представление в режиме реального времени.
Создание непрерывных представлений
Непрерывные представления определяются как представления PostgreSQL с параметром action
, установленным в materialize
. Вот синтаксис для создания непрерывного представления:
CREATE VIEW name [WITH (action=materialize [, ...])] AS query
Примечание
По умолчанию action
установлен в materialize
, и поэтому action
можно опустить при создании непрерывных представлений. Пока выбран поток, PipelineDB будет интерпретировать оператор CREATE VIEW
с action
установленным в materialize
.
где запрос является подмножеством оператора SELECT
PostgreSQL:
SELECT [ DISTINCT [ ON ( expression [, ...] ) ] ] expression [ [ AS ] output_name ] [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ]
где from_item может быть одним из следующих вариантов:
stream_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
from_item [ NATURAL ] join_type from_item [ ON join_condition ]
Примечание
Этот раздел ссылается на потоки, которые похожи на таблицы и являются источниками данных для непрерывных представлений и преобразований, указываемыми в предложении FROM
. Более подробная информация по ним приведена в разделе Потоки, но для начала можно их воспринимать как append-only таблицы (только для добавления данных).
expression
expression или grouping sets specification PostgreSQL.
output_name
Необязательный идентификатор для именования выражения
condition
Любое выражение, которое выдает результат типа
boolean
. Любая строка, которая не удовлетворяет этому условию, будет исключена из вывода. Строка удовлетворяет условию, если она возвращаетtrue
, когда фактические значения строки подставляются вместо любых переменных ссылок.
Примечание
Это в основном касается только синтаксиса создания непрерывных представлений. Чтобы узнать больше о семантике каждого из этих элементов запроса, ознакомьтесь с документацией PostgreSQL по SELECT.
Удаление непрерывных представлений
Чтобы удалить (DROP
) непрерывное представление из системы, используйте команду DROP VIEW
. Синтаксис команды прост:
DROP VIEW name
Это удалит непрерывное представление из системы вместе со всеми связанными ресурсами.
Усечение непрерывных представлений
Для удаления всех данных непрерывного представления без удаления самого непрерывного представления можно использовать функцию truncate_continuous_view:
SELECT truncate_continuous_view('name');
Эта команда эффективно удалит все строки непрерывных представлений и, следовательно, аналогична команде TRUNCATE_ PostgreSQL.
Просмотр непрерывных представлений
Чтобы просмотреть непрерывные представления и их текущие определения в системе, можно выполнить следующий запрос:
SELECT * FROM pipelinedb.views;
Извлечение данных
Поскольку непрерывные представления очень схожи с обычными представлениями, извлечение данных из них сводится к выполнению команды SELECT
:
SELECT * FROM some_continuous_view
======== =========== user event_count ======== =========== a 10 b 20 c 30 ======== ===========
Любой оператор SELECT
допустим для непрерывного представления, что позволяет выполнять дальнейший анализ постоянно обновляемого содержимого представлений:
SELECT t.name, sum(v.value) + sum(t.table_value) AS total FROM some_continuous_view v JOIN some_table t ON v.id = t.id GROUP BY t.name
======== =========== name total ======== =========== usman 10 jeff 20 derek 30 ======== ===========
Истечение времени жизни (TTL)
Распространенным механизмом PipelineDB является включение временного столбца в агрегированные группировки и удаление старых строк, которые больше не нужны, как определено в данном столбце. Хотя существует несколько способов достижения такого поведения, PipelineDB предоставляет встроенный контроль истечения срока строк с помощью критериев времени жизни (TTL), указанных на уровне непрерывного представления.
Контроль срока TTL может быть настроен для непрерывных представлений с помощью параметров хранения ttl
и ttl_column
. Истечение срока действия контролируется одним или несколькими процессами сборщика которые будут удалять (DELETE
) любые строки со значением ttl_column
, которое старше интервала, указанного в ttl
(относительно времени расчета). Вот пример определения непрерывного представления, который скажет сборщику удалить любые строки, где столбец, минуты, старше одного месяца:
CREATE VIEW v_ttl WITH (ttl = '1 month', ttl_column = 'minute') AS SELECT minute(arrival_timestamp), COUNT(*) FROM some_stream GROUP BY minute;
Обратите внимание, что поведение TTL является лишь подсказкой для сборщика, и поэтому не гарантируется, что строки будут физически удалены именно в момент истечения срока действия.
Если необходимо гарантировать, что не будут прочитаны строки, с истекшим сроком действия TTL, создайте представление над непрерывным представлением с предложением WHERE
, исключающим строки с истекшим сроком во время чтения.
Изменение TTL
Значения TTL могут быть добавлены, изменены и удалены из непрерывного представления с помощью функции pipelinedb.set_ttl:
pipelinedb.set_ttl ( cv_name, ttl, ttl_column )
Примените заданные параметры к непрерывным представлениям. ttl - это интервал, выраженный в виде строки (например,
1 день
), а ttl_column - это имя столбца на основе метки времени.Передача
NULL
для обоих параметров ttl и ttl_column эффективно удалит TTL из заданного непрерывного представления. Обратите внимание, что TTL не может быть изменен или удален из непрерывного представления со скользящим окном.
Активация и деактивация
Поскольку непрерывные представления постоянно обрабатывают входные потоки, может быть полезно иметь представление о запуске и остановке этой обработки без необходимости полного отключения PipelineDB. Например, если непрерывное представление вызывает неожиданно высокую нагрузку на систему или начинает выдавать ошибки, может быть полезно временно остановить непрерывную обработку для этого представления (или всех представлений) до устранения проблемы.
Данный уровень контроля обеспечивается командами activate
и deactivate
, которые являются синонимами «пуска» и «паузы». Когда непрерывные представления запущены, они активно читают данные из входных потоков и соответственно постепенно обновляют свои результаты. И наоборот, непрерывные представления на паузе не читают данные из входных потоков и не обновляют результаты. PipelineDB продолжает работать, когда непрерывные представления на паузе, а сами непрерывные представления все еще можно просматривать - они просто не обновляются.
Сигнатуры функций принимают только название непрерывного представления или трансформации:
SELECT pipelinedb.activate('continuous_view_or_transform');
SELECT pipelinedb.deactivate('continuous_view_or_transform');
Непрерывные преобразования (непрерывные преобразования) также могут быть активированы и деактивированы.
Важно
Когда непрерывные запросы (представления или преобразования) неактивны, любые события, записанные в их входные потоки во время паузы, не будут прочитаны этим непрерывным запросом, даже после их повторной активации.
См. Операционные функции для получения дополнительной информации.
Партицирование
PipelineDB поддерживает партицирование непрерывных представлений. Подобно обычным партицированным таблицам в PostgreSQL, партицированные непрерывные представления позволяют разбить одно большое представление на более мелкие физические части для снижения накладных расходов на обновление, улучшение производительности запроса и оптимизацию удаления данных, которые больше не нужны.
PipelineDB автоматически создает партиции по мере необходимости на основе фактических значений данных, поступающих из потоков.
Поддерживается только подмножество функций партицирования PostgreSQL. Непрерывные представления могут быть разделены на диапазоны по столбцу, основанному на метке времени, с использованием фиксированных временных интервалов. Далее приведен синтаксис для создания партицированного непрерывного представления:
CREATE VIEW name WITH (partition_by = column, partition_duration = 'interval') AS query;
где partition_by
должен ссылаться на столбец timestamp
или timestamptz
, который должен являться одним из столбцов вывода query
, а partition_duration
- это указание диапазона партицирования в формате типа данных PostgresQL interval
.
Например, следующее определение создает непрерывное представление, разделенное по столбцу ts, где каждая партиция соответствует интервалу в один месяц:
CREATE VIEW v_part WITH (partition_by = ts, partition_duration = '1 month') AS SELECT ts, COUNT(*) FROM stream GROUP BY ts;
В отличие от таблиц PostgreSQL разделенных по диапазонам, непрерывные представления в настоящее время не поддерживают ручное определение границ диапазона. PipelineDB автоматически назначает границы диапазона партицирования следующим образом:
для некоторых распространенных интервалов партицирования выполняется обработка особых случаев, чтобы пользователи получали предсказуемые и ожидаемые границы партицирования. Например, с интервалом партицирования
1 неделя
пользователи ожидают, что границы каждого партицирования на недели будут соответствовать началу/концу календарной недели. Это также обеспечивает разумные ожидания производительности, поскольку пользователи обычно предпочитают, чтобы одна календарная неделя занимала не более одной партиции. Ниже приведен список всех поддерживаемых особых случаев:1 год
1 месяц
1 неделя
1 день
1 час
1 минута
1 секунда
Например, для строки с временной меткой
'2024-04-11 13:53:07.82049'`PipelineDB выберет (и автоматически создаст, если необходимо) партицию с границами :code:`['2024-01-01', '2025-01-01']
, если partition_duration составляет1 год
, или['2024-04-01', '2024-05-01']
, если partition_duration составляет1 месяц
, и так далее.для прочих интервалов границы диапазона выбираются автоматически путем округления до ближайших нижних и верхних временных отметок с указанной степенью партицирования. Например, с интервалом партицирования
3 минуты
и значением временной отметки2024-04-11 13:53:07.82049
PipelineDB выберет партицию с соответствующими границами диапазона['2024-04-11 13:51:00', '2024-04-11 13:54:00']
и создаст ее, если такая партиция еще не существует.
Непрерывные преобразования (непрерывные преобразования) не могут быть разделены, поскольку они не хранят данные.
Примеры
Давайте рассмотрим несколько примеров непрерывных представлений и разберем, чего достигает каждое из них.
Важно
Важно понимать, что единственные данные, которые PipelineDB сохраняет для непрерывного представления, - это те, что вернулись бы при выполнении SELECT * FROM my_cv
в нем (плюс небольшое количество метаданных). Это относительно новая концепция, но именно она делает непрерывные представления таким мощным инструментом!
Еще раз подчеркнем, что непрерывное представление будет хранить только одну строку в PipelineDB (всего несколько байтов), даже если он прочитает триллион событий за время работы:
CREATE VIEW avg_of_forever AS SELECT AVG(x) FROM one_trillion_events_stream;
Вычисляет количество уникальных пользователей, прошедших по url-ссылке, в день, используя только постоянный объем памяти в день:
CREATE VIEW uniques AS SELECT date_trunc('day', arrival_timestamp) AS day, referrer, COUNT(DISTINCT user_id) FROM users_stream GROUP BY day, referrer;
Вычисляет линейную регрессию потока точек данных, сгруппированных по минутам:
CREATE VIEW lreg AS SELECT date_trunc('minute', arrival_timestamp) AS minute, regr_slope(y, x) AS mx, regr_intercept(y, x) AS b FROM datapoints_stream GROUP BY minute;
Сколько показов рекламы мы осуществили за последние пять минут?
CREATE VIEW imps AS SELECT COUNT(*) FROM imps_stream WHERE (arrival_timestamp > clock_timestamp() - interval '5 minutes');
Каковы 90-й, 95-й и 99-й процентили задержки запроса моих серверов?
CREATE VIEW latency AS SELECT percentile_cont(array[90, 95, 99]) WITHIN GROUP (ORDER BY latency) FROM latency_stream;
Мы надеемся, что информация о непрерывных представлениях была полезной! Далее рекомендуем изучить, как работают потоки Потоки.