Когда следует использовать refreshable materialized views?
Refreshable materialized views могут запускать батч-процессы и выполнять такие задачи, как денормализация. Между refreshable materialized views можно задавать зависимости, чтобы одно представление зависело от результатов другого и выполнялось только после его завершения. Это может заменить запланированные рабочие процессы или простые DAG, например задачу dbt. Подробнее о том, как задавать зависимости между refreshable materialized views, см. в разделе Dependencies страницы CREATE VIEW.
Как обновить refreshable materialized view?
SYSTEM REFRESH VIEW:
Когда в последний раз обновлялась refreshable materialized view?
system.view_refreshes, как показано ниже:
Как изменить частоту обновления?
ALTER TABLE...MODIFY REFRESH.
Использование APPEND для добавления новых строк
APPEND позволяет добавлять новые строки в конец таблицы, не заменяя представление целиком.
Один из вариантов использования этой возможности — фиксировать снимки значений на определённый момент времени. Например, представим, что у нас есть таблица events, заполняемая потоком сообщений из Kafka, Redpanda или другой стриминговой платформы данных.
4096 значений в столбце uuid. Мы можем выполнить следующий запрос, чтобы найти значения с наибольшим общим количеством вхождений:
uuid в новой таблице events_snapshot. Схема events_snapshot будет выглядеть так:
events_snapshot, чтобы получить количество для конкретного uuid в динамике:
Примеры
Stack Overflow
votes, users, badges, posts и postlinks.
В этом руководстве мы показали, как денормализовать набор данных postlinks в таблицу posts с помощью следующего запроса:
posts_with_links, но в производственной системе эту операцию нужно запускать периодически.
Обновляться потенциально могут обе таблицы: posts и postlinks. Поэтому вместо того, чтобы пытаться реализовать этот JOIN с помощью incremental materialized views, может быть достаточно просто запускать этот запрос через заданные интервалы, например раз в час, сохраняя результаты в таблице post_with_links.
Здесь как раз полезна refreshable materialized view, и создать её можно с помощью следующего запроса:
Синтаксис здесь идентичен
incremental materialized view, за исключением того, что мы добавляем предложение REFRESH:IMDb
actors, directors, genres, movie_directors, movies и roles.
Затем можно написать следующий запрос, чтобы получить сводную информацию по каждому актёру, упорядоченную по числу появлений в фильмах.