Представления и материализованные представления
Представления
Представление — это именованный запрос, хранящийся в базе данных. PostgreSQL выполняет запрос, определяющий представление, каждый раз, когда к представлению обращаются. Можно создать представление на основе одной или нескольких таблиц, или других представлений. Представление можно использовать практически так же, как и обыкновенную таблицу. Представления позволяют скрывать за совместимыми интерфейсами внутреннее устройство таблиц, которые могут меняться по мере развития приложения.
Представления в PostgreSQL реализованы на основе системы правил. По сути, нет никакой разницы между одним оператором и набором команд, приведенными ниже.
CREATE VIEW view1 AS SELECT * FROM table1;
CREATE TABLE view1 (<the same column list as table1>);
CREATE RULE "_RETURN" AS ON SELECT TO view1 DO INSTEAD
SELECT * FROM table1;
Второй фрагмент кода представляет собой внутренний код команды CREATE VIEW
. Информация о представлении в системных каталогах PostgreSQL такая же, как и о таблице. Для парсера нет разницы между таблицей и представлением, для него это одно и то же — отношения. Преимущество реализации представлений через систему правил заключается в том, что планировщик получает в одном дереве запроса всю информацию о таблицах, которые нужно прочитать, о том, как связаны эти таблицы, об условиях в представлениях, а также об условиях, заданных в исходном запросе. Планировщик должен решить, какой способ является лучшим для выполнения запроса, и чем больше информации он имеет, тем лучшим может быть это решение. За подробностями обратитесь к статье Views and the Rule System.
Создание представления
Используйте команду CREATE VIEW для создания представления.
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW <имя> [ ( <имя_столбца> [, ...] ) ]
[ WITH ( <имя_параметра_представления> [= <значение_параметра_представления>] [, ... ] ) ]
AS <запрос>
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
TEMPORARY или TEMP |
Если указано, представление создается как временное. PostgreSQL удаляет временные представления в конце текущей сессии. Существующие постоянные отношения с тем же именем не видны в текущей сессии, пока существует временное представление, если только на них не ссылаются, используя имена с указанием схемы. Если запрос представления ссылается на временную таблицу, представление создается как временное независимо от того, указано |
RECURSIVE |
Создает рекурсивное представление. Для рекурсивного представления необходимо указать список имен столбцов представления |
<имя> |
Имя создаваемого представления (можно указать схему) |
<имя_столбца> |
Необязательный список имен, назначаемых столбцам представления. Если он не указан, имена столбцов берутся из результатов запроса |
WITH ( <имя_параметра_представления> [= <значение_параметра_представления>] [, … ] ) |
В этом выражении указываются необязательные параметры представления. Поддерживаются следующие параметры:
|
<запрос> |
Команда SELECT или VALUES, возвращающая столбцы и строки представления |
WITH [CASCADED | LOCAL] CHECK OPTION |
Эта опция управляет поведением обновляемых представлений. Если она указана, команды
Если указана
|
Форма выражения CREATE OR REPLACE
позволяет переписать представление. Если представление с таким именем уже существует, оно заменяется. Новый запрос должен генерировать те же столбцы, что и существующий (те же имена столбцов, в том же порядке и с теми же типами данных), но можно добавить новые столбцы в конец списка. Вычисления, генерирующие столбцы представления, могут отличаться.
Если указано имя схемы, например, CREATE VIEW schema1.view1 …
, PostgreSQL создает представление в указанной схеме, в противном случае — в текущей. Временные представления существуют в специальной схеме, поэтому имя схемы нельзя указывать при создании временных представлений. Имя представления должно отличаться от имен других представлений, таблиц, последовательностей, индексов или сторонних таблиц в схеме.
Например, имеется таблица books
:
book_id | title | author_id | public_year | genre | evaluation | price ---------+-------------------------------------+-----------+-------------+---------+------------+------- 1 | Mrs. Dalloway | 1 | 1925 | novel | 7.82 | 360 2 | To the Lighthouse | 1 | 1927 | novel | 8.45 | 440 3 | To Kill a Mockingbird | 2 | 1960 | novel | 7.48 | 750 4 | The Great Gatsby | 3 | 1925 | novel | 9.23 | 900 5 | The Lord of the Rings | 4 | 1955 | fantasy | 9.49 | 1200 6 | 1984 | 5 | 1949 | sci-fi | 8.17 | 520 7 | The Hobbit, or There and Back Again | 4 | 1937 | fantasy | 9.32 | 1100 8 | War and Peace | 6 | 1869 | novel | 9.69 | 1500 9 | Hyperion | 7 | 1989 | sci-fi | 9.46 | 610 10 | The Time Machine | 8 | 1895 | sci-fi | 8.12 | 450
Создайте представление, содержащее все книги жанра novel
.
CREATE VIEW novels AS
SELECT *
FROM books
WHERE genre = 'novel';
Отобразите содержимое представления.
SELECT * FROM novels;
Результат:
book_id | title | author_id | public_year | genre | evaluation | price ---------+-----------------------+-----------+-------------+-------+------------+------- 1 | Mrs. Dalloway | 1 | 1925 | novel | 7.82 | 360 2 | To the Lighthouse | 1 | 1927 | novel | 8.45 | 440 3 | To Kill a Mockingbird | 2 | 1960 | novel | 7.48 | 750 4 | The Great Gatsby | 3 | 1925 | novel | 9.23 | 900 8 | War and Peace | 6 | 1869 | novel | 9.69 | 1500
Если имя и тип столбца не указан в представлении и не может быть взят из базового отношения, PostgreSQL присваивает имя ?column?
и использует text
в качестве типа по умолчанию. Например:
CREATE VIEW test AS SELECT 'Test';
Проверьте результат.
SELECT * from test;
?column? ---------- Test
В таких случаях лучше явно указывать имя и тип столбца.
CREATE VIEW test1 AS SELECT text 'Test' AS column1;
Разрешения владельца представления определяют доступ к таблицам, которые используются в представлении. В некоторых случаях это можно использовать для обеспечения безопасного, но ограниченного доступа к базовым таблицам. См. Безопасность на уровне столбцов.
Обновляемые представления
Простые представления можно обновлять — PostgreSQL выполняет инструкции INSERT
, UPDATE
и DELETE
для представления так же, как и для обыкновенной таблицы. Представление является обновляемым, если оно удовлетворяет всем следующим условиям:
-
Представление должно иметь одну запись в выражении
FROM
, которая ссылается на таблицу или другое обновляемое представление. -
Определение представления не должно содержать выражений
WITH
,DISTINCT
,GROUP BY
,HAVING
,LIMIT
илиOFFSET
на верхнем уровне. -
Определение представления не должно содержать операции с множествами (
UNION
,INTERSECT
илиEXCEPT
) на верхнем уровне. -
Список выборки в запросе не должен содержать агрегатные и оконные функции, а также функции, возвращающие множества.
Обновляемое представление может содержать обновляемые и необновляемые столбцы. Столбец является обновляемым, если он является простой ссылкой на обновляемый столбец базового отношения, в противном случае столбец доступен только для чтения. Если оператор INSERT
или UPDATE
попытается присвоить ему значение, возникнет ошибка.
Если представление является обновляемым, система преобразует любой оператор INSERT
, UPDATE
или DELETE
, применяемый к представлению, в соответствующий оператор базового отношения. Оператор INSERT
с выражением ON CONFLICT UPDATE
полностью поддерживается.
Если обновляемое представление содержит условие WHERE
, оно ограничивает то, какие строки базового отношения доступны для изменения с помощью операторов UPDATE
и DELETE
в представлении. Однако UPDATE
позволяет изменить строку так, чтобы она больше не удовлетворяла условию WHERE
и, следовательно, больше не была видна в представлении. Аналогично, команда INSERT
может вставлять строки базового отношения, которые не удовлетворяют условию WHERE
и не видны в представлении. CHECK OPTION
можно использовать, чтобы команды INSERT
и UPDATE
не создавали такие строки.
Создайте представление c LOCAL CHECK OPTION
.
CREATE VIEW novels1 AS
SELECT *
FROM novels
WHERE public_year < 1959
WITH LOCAL CHECK OPTION;
Отобразите содержимое представления.
SELECT * FROM novels1;
Результат:
book_id | title | author_id | public_year | genre | evaluation | price ---------+-------------------+-----------+-------------+-------+------------+------- 1 | Mrs. Dalloway | 1 | 1925 | novel | 7.82 | 360 2 | To the Lighthouse | 1 | 1927 | novel | 8.45 | 440 4 | The Great Gatsby | 3 | 1925 | novel | 9.23 | 900 8 | War and Peace | 6 | 1869 | novel | 9.69 | 1500
Добавьте новую строку в novels1
.
INSERT INTO novels1 (book_id, title, author_id, public_year, genre, evaluation, price)
VALUES (11, 'The World Set Free', 8, 1914, 'sci-fi', 7.9, 450);
Добавлена строка The World Set Free
, но она не отображается в представлении novels1
, поскольку строка не соответствует условию представления novels
genre = 'novel'
. Чтобы увидеть эту строку, выполните SELECT
для таблицы books
.
Создайте еще одно представление с параметром CASCADED CHECK OPTION
и попробуйте добавить строку, которая не соответствует условию представления novels
.
CREATE VIEW novels2 AS
SELECT *
FROM novels
WHERE public_year < 1959
WITH CASCADED CHECK OPTION;
INSERT INTO novels2 (book_id, title, author_id, public_year, genre, evaluation, price)
VALUES (12, 'The Food of the Gods', 8, 1904, 'sci-fi', 8.4, 620);
Произойдет ошибка:
ERROR: new row violates check option for view "novels" DETAIL: Failing row contains (12, The Food of the Gods, 8, 1904, sci-fi, 8.4, 620).
Опция CASCADED CHECK OPTION
проверяет условия текущего представления и всех базовых представлений.
Более сложные представления по умолчанию доступны только для чтения. Система не позволяет выполнять операции вставки, обновления или удаления в представлении. Для выполнения этих операций можно создать в представлении триггеры INSTEAD OF
, которые преобразуют операции над представлением в соответствующие действия над другими таблицами. За дополнительной информацией обратитесь к статье CREATE TRIGGER.
Изменение свойств представления
Вы можете использовать команду ALTER VIEW для изменения различных вспомогательных свойств представления. Пользователь должен быть владельцем представления, чтобы выполнить ALTER VIEW
. Если необходимо изменить запрос, определяющий представление, используйте оператор CREATE OR REPLACE VIEW
, упомянутый выше.
Команда ALTER VIEW
имеет следующий синтаксис:
ALTER VIEW [ IF EXISTS ] <имя> ALTER [ COLUMN ] <имя_столбца> SET DEFAULT <выражение>
ALTER VIEW [ IF EXISTS ] <имя> ALTER [ COLUMN ] <имя_столбца> DROP DEFAULT
ALTER VIEW [ IF EXISTS ] <имя> OWNER TO { <новый_владелец> | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER VIEW [ IF EXISTS ] <имя> RENAME [ COLUMN ] <имя_столбца> TO <новое_имя_столбца>
ALTER VIEW [ IF EXISTS ] <имя> RENAME TO <новое_имя>
ALTER VIEW [ IF EXISTS ] <имя> SET SCHEMA <новая_схема>
ALTER VIEW [ IF EXISTS ] <имя> SET ( <имя_параметра_представления> [= <значение_параметра_представления>] [, ... ] )
ALTER VIEW [ IF EXISTS ] <имя> RESET ( <имя_параметра_представления> [, ... ] )
<имя> |
Имя существующего представления (можно указать схему) |
<имя_столбца> |
Имя существующего столбца |
<новое_имя_столбца> |
Новое имя существующего столбца |
IF EXISTS |
Предотвращает возникновение ошибки, если представления не существует. В этом случае будет выведено уведомление |
SET/DROP DEFAULT |
Эти параметры устанавливают или удаляют значение по умолчанию для столбца. Значение столбца по умолчанию подставляется в любую команду |
<новый_владелец> |
Имя пользователя, назначаемого новым владельцем представления |
<новое_имя> |
Новое имя представления |
<новая_схема> |
Новая схема представления |
SET ( <имя_параметра_представления> [= <значение_параметра_представления>] [, … ] ) RESET ( <имя_параметра_представления> [, … ] ) |
Устанавливает или сбрасывает параметры представления. В настоящее время поддерживаются параметры:
|
По историческим причинам ALTER TABLE также можно использовать с представлениями, но допустимы только те варианты ALTER TABLE
, которые эквивалентны показанным выше.
Можно использовать ALTER VIEW
, чтобы переименовать представление novels
в all_novels_from_books
.
ALTER VIEW novels RENAME TO all_novels_from_books;
Также можно установить значение столбца по умолчанию в обновляемом представлении.
ALTER VIEW all_novels_from_books ALTER COLUMN genre SET DEFAULT 'novel';
INSERT INTO all_novels_from_books (book_id, title, author_id, public_year, evaluation, price)
VALUES (12, 'Anna Karenina', 6, 1877, 8.9, 750);
Строка Anna Karenina
вставлена со значением novel
в столбце genre
. Если вы попытаетесь вставить строку непосредственно в таблицу books
, значение novel
не будет использоваться как значение по умолчанию для столбца genre
.
Удаление представления
Можно использовать команду DROP VIEW для удаления представления. Чтобы выполнить эту команду, нужно быть владельцем представления.
DROP VIEW [ IF EXISTS ] <имя> [, ...] [ CASCADE | RESTRICT ]
IF EXISTS |
Предотвращает возникновение ошибки, если представления не существует. В этом случае будет выведено уведомление |
<имя> |
Имя представления (можно указать схему), подлежащего удалению |
CASCADE |
Удаляет объекты, которые зависят от представления (например, другие представления), и, в свою очередь, все объекты, зависящие от этих объектов (см. Dependency Tracking) |
RESTRICT |
Отказывает в удалении представления, если от него зависят какие-либо объекты. Это поведение по умолчанию |
Пример:
DROP VIEW novels1;
Материализованные представления
Материализованные представления используют систему правил, аналогично представлениям, но сохраняют результаты в табличной форме. В отличие от представлений, материализованное представление хранит не только запрос, но и его результаты.
Разница между материализованным представлением и таблицей заключается в том, что материализованное представление не может быть обновлено напрямую. Его можно обновить с помощью оператора REFRESH MATERIALIZED VIEW.
Информация о материализованном представлении в системных каталогах PostgreSQL такая же, как и о таблице или представлении. Для парсера материализованное представление является отношением. Когда запрос ссылается на материализованное представление, данные возвращаются непосредственно из материализованного представления так же, как и из таблицы. Система правил используется только для заполнения материализованного представления.
Хотя доступ к данным, хранящимся в материализованном представлении, часто происходит намного быстрее, чем доступ к базовым таблицам напрямую или через обычное представление, данные могут быть не всегда актуальны. Материализованные представления можно использовать, когда некоторое устаревание данных вполне приемлемо. Например, агрегированная статистика, хранящаяся в материализованном представлении, может обновляться по таймеру в автоматическом режиме. Можно запланировать задачу по обновлению статистики с помощью оператора REFRESH MATERIALIZED VIEW
.
Другой вариант использования материализованного представления — обеспечение более быстрого доступа к данным, получаемым из удаленной системы через обертку внешних данных (foreign data wrapper). Даже если обертка внешних данных не поддерживает индексы, в некоторых случаях индексы можно создать для материализованного представления.
Создание материализованного представления
Оператор CREATE MATERIALIZED VIEW определяет новое материализованное представление запроса. PostgreSQL выполняет запрос и заполняет представление в момент выполнения команды (если не используется WITH NO DATA
). Временные материализованные представления не поддерживаются. Для выполнения CREATE MATERIALIZED VIEW
требуется привилегия CREATE
на схему, используемую для материализованного представления.
CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] <имя>
[ (<имя_столбца> [, ...] ) ]
[ USING <метод> ]
[ WITH ( <параметр_хранения> [= <значение>] [, ... ] ) ]
[ TABLESPACE <табличное_пространство> ]
AS <запрос>
[ WITH [ NO ] DATA ]
IF NOT EXISTS |
Предотвращает возникновение ошибки, если представление с таким именем уже существует. В этом случае будет выведено уведомление |
<имя> |
Имя материализованного представления (можно указать схему). Имя должно отличаться от имени любого другого отношения (таблицы, последовательности, индекса, представления, материализованного представления или внешней таблицы) в той же схеме |
<имя_столбца> |
Имя столбца в новом материализованном представлении. Если имена столбцов не указаны, они берутся из результатов запроса |
USING <метод> |
Необязательное выражение, которое определяет табличный метод доступа, используемый для хранения содержимого материализованного представления. Этот метод должен быть типа |
WITH ( <параметр_хранения> [= <значение>] [, … ] ) |
Задает дополнительные параметры хранения для материализованного представления. Все параметры, поддерживаемые для |
TABLESPACE <табличное_пространство> |
|
<запрос> |
Команда |
WITH [NO] DATA |
Указывает, будет ли материализованное представление заполнено в момент создания. Если материализованное представление не заполняется, оно помечается как нечитаемое, и к нему нельзя будет обратиться до выполнения |
Создайте материализованное представление на основе упомянутой выше таблицы books
и следующей таблицы authors
:
id | name ----+--------------------- 1 | Virginia Woolf 2 | Harper Lee 3 | F. Scott Fitzgerald 4 | J.R.R. Tolkien 5 | George Orwell 6 | Leo Tolstoy 7 | Dan Simmons 8 | Herbert Wells
CREATE MATERIALIZED VIEW bookshelf AS
SELECT
b.book_id,
b.title,
b.public_year,
a.name,
b.genre
FROM books b, authors a
WHERE b.author_id = a.id;
Выведите содержимое bookshelf
.
SELECT * FROM bookshelf;
Результат:
book_id | title | public_year | name | genre ---------+-------------------------------------+-------------+---------------------+--------- 1 | Mrs. Dalloway | 1925 | Virginia Woolf | novel 2 | To the Lighthouse | 1927 | Virginia Woolf | novel 3 | To Kill a Mockingbird | 1960 | Harper Lee | novel 4 | The Great Gatsby | 1925 | F. Scott Fitzgerald | novel 5 | The Lord of the Rings | 1955 | J.R.R. Tolkien | fantasy 6 | 1984 | 1949 | George Orwell | sci-fi 7 | The Hobbit, or There and Back Again | 1937 | J.R.R. Tolkien | fantasy 8 | War and Peace | 1869 | Leo Tolstoy | novel 9 | Hyperion | 1989 | Dan Simmons | sci-fi 10 | The Time Machine | 1895 | Herbert Wells | sci-fi 11 | The World Set Free | 1914 | Herbert Wells | sci-fi 12 | Anna Karenina | 1877 | Leo Tolstoy | novel
Добавьте строку в таблицу books
.
INSERT INTO books (book_id, title, author_id, public_year, genre, evaluation, price)
VALUES (13, 'Resurrection', 6, 1899, 'novel', 9.1, 460);
Отобразите материализованное представление bookshelf
:
SELECT * FROM bookshelf;
Результат тот же, новая строка в материализованном представлении не отображается.
book_id | title | public_year | name | genre ---------+-------------------------------------+-------------+---------------------+--------- 1 | Mrs. Dalloway | 1925 | Virginia Woolf | novel 2 | To the Lighthouse | 1927 | Virginia Woolf | novel 3 | To Kill a Mockingbird | 1960 | Harper Lee | novel 4 | The Great Gatsby | 1925 | F. Scott Fitzgerald | novel 5 | The Lord of the Rings | 1955 | J.R.R. Tolkien | fantasy 6 | 1984 | 1949 | George Orwell | sci-fi 7 | The Hobbit, or There and Back Again | 1937 | J.R.R. Tolkien | fantasy 8 | War and Peace | 1869 | Leo Tolstoy | novel 9 | Hyperion | 1989 | Dan Simmons | sci-fi 10 | The Time Machine | 1895 | Herbert Wells | sci-fi 11 | The World Set Free | 1914 | Herbert Wells | sci-fi 12 | Anna Karenina | 1877 | Leo Tolstoy | novel
Выполните оператор REFRESH MATERIALIZED VIEW, чтобы обновить bookshelf
и проверьте результат.
REFRESH MATERIALIZED VIEW bookshelf;
SELECT * FROM bookshelf;
Материализованное представление обновлено.
book_id | title | public_year | name | genre ---------+-------------------------------------+-------------+---------------------+--------- 1 | Mrs. Dalloway | 1925 | Virginia Woolf | novel 2 | To the Lighthouse | 1927 | Virginia Woolf | novel 3 | To Kill a Mockingbird | 1960 | Harper Lee | novel 4 | The Great Gatsby | 1925 | F. Scott Fitzgerald | novel 5 | The Lord of the Rings | 1955 | J.R.R. Tolkien | fantasy 6 | 1984 | 1949 | George Orwell | sci-fi 7 | The Hobbit, or There and Back Again | 1937 | J.R.R. Tolkien | fantasy 8 | War and Peace | 1869 | Leo Tolstoy | novel 9 | Hyperion | 1989 | Dan Simmons | sci-fi 10 | The Time Machine | 1895 | Herbert Wells | sci-fi 11 | The World Set Free | 1914 | Herbert Wells | sci-fi 12 | Anna Karenina | 1877 | Leo Tolstoy | novel 13 | Resurrection | 1899 | Leo Tolstoy | novel
Изменение свойств материализованного представления
Можно использовать оператор ALTER MATERIALIZED VIEW, чтобы изменить различные вспомогательные свойства материализованного представления. Команда ALTER MATERIALIZED VIEW
имеет следующий синтаксис:
ALTER MATERIALIZED VIEW [ IF EXISTS ] <имя>
<действие> [, ... ]
ALTER MATERIALIZED VIEW <имя>
[ NO ] DEPENDS ON EXTENSION <имя_расширения>
ALTER MATERIALIZED VIEW [ IF EXISTS ] <имя>
RENAME [ COLUMN ] <имя_столбца> TO <новое_имя_столбца>
ALTER MATERIALIZED VIEW [ IF EXISTS ] <имя>
RENAME TO <новое_имя>
ALTER MATERIALIZED VIEW [ IF EXISTS ] <имя>
SET SCHEMA <новая_схема>
ALTER MATERIALIZED VIEW ALL IN TABLESPACE <имя> [ OWNED BY <имя_роли> [, ... ] ]
SET TABLESPACE <новое_табличное_пространство> [ NOWAIT ]
где <действие> одно из:
ALTER [ COLUMN ] <имя_столбца> SET STATISTICS integer
ALTER [ COLUMN ] <имя_столбца> SET ( <атрибут> = <значение> [, ... ] )
ALTER [ COLUMN ] <имя_столбца> RESET ( <атрибут> [, ... ] )
ALTER [ COLUMN ] <имя_столбца> SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER [ COLUMN ] <имя_столбца> SET COMPRESSION <метод_сжатия>
CLUSTER ON <имя_индекса>
SET WITHOUT CLUSTER
SET TABLESPACE <новое_табличное_пространство>
SET ( <параметр_хранения> [= <значение>] [, ... ] )
RESET ( <параметр_хранения> [, ... ] )
OWNER TO { <новый_владелец> | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
<имя> |
Имя существующего материализованного представления (можно указать схему) |
<имя_столбца> |
Имя нового или существующего столбца |
<имя_расширения> |
Имя расширения, от которого будет зависеть материализованное представление (или не будет, если указано |
<новое_имя_столбца> |
Новое имя существующего столбца |
<новый_владелец> |
Имя пользователя, назначаемого новым владельцем материализованного представления |
<новое_имя> |
Новое имя материализованного представления |
<новая_схема> |
Новая схема материализованного представления |
Например, с помощью ALTER MATERIALIZED VIEW
можно переименовать представление bookshelf
в books_authors
.
ALTER MATERIALIZED VIEW bookshelf RENAME TO books_authors;
Выполнить ALTER MATERIALIZED VIEW
может только владелец материализованного представления. Чтобы сменить схему материализованного представления, необходимо также иметь право CREATE
в новой схеме. Чтобы сменить владельца, требуется быть членом новой роли, а эта роль должна иметь право CREATE
в схеме материализованного представления.
Формы и действия выражения ALTER MATERIALIZED VIEW
являются подмножеством форм и действий ALTER TABLE и имеют то же значение применительно к материализованным представлениям.
Удаление материализованного представления
Используйте оператор DROP MATERIALIZED VIEW, чтобы удалить материализованное представление. Для выполнения этой команды вы должны быть владельцем материализованного представления.
DROP MATERIALIZED VIEW [ IF EXISTS ] <имя> [, ...] [ CASCADE | RESTRICT ]
IF EXISTS |
Предотвращает возникновение ошибки, если материализованного представления не существует. В этом случае будет выведено уведомление |
<имя> |
Имя материализованного представления (можно указать схему), подлежащего удалению |
CASCADE |
Удаляет объекты, которые зависят от материализованного представления (например, другие материализованные и обыкновенные представления), и, в свою очередь, все объекты, зависящие от этих объектов (см. Dependency Tracking) |
RESTRICT |
Отказывает в удалении материализованного представления, если от него зависят какие-либо объекты. Это поведение по умолчанию |
Пример:
DROP MATERIALIZED VIEW books_authors;
Сравнение представлений и материализованных представлений
Основные различия между представлением и материализованным представлением следующие:
-
Представление сохраняет только определяющий его запрос. Материализованное представление хранит определяющий запрос и его результат.
-
Каждый раз при обращении к обыкновенному представлению выполняется его определяющий запрос. При обращении к материализованному представлению оно возвращает ранее сохраненный результат. Материализованное представление может возвращать устаревшие данные, если были изменены его базовые таблицы или представления. Необходимо выполнить оператор
REFRESH MATERIALIZED VIEW
, чтобы обновить материализованное представление. -
Материализованное представление часто возвращает результат намного быстрее, чем если получать данные напрямую из базовых таблиц или через обыкновенное представление.
Получение информации о представлениях и материализованных представлениях
Можно использовать метакоманду psql
\dv
или \dv+
, чтобы получить список представлений.
\dv
Результат:
List of relations Schema | Name | Type | Owner --------+-----------------------+------+---------- public | all_novels_from_books | view | postgres public | novels2 | view | postgres public | test | view | postgres (3 rows)
Метакоманда \dv+
предоставляет более подробную информацию.
Schema | Name | Type | Owner | Persistence | Size | Description --------+-----------------------+------+----------+-------------+---------+------------- public | all_novels_from_books | view | postgres | permanent | 0 bytes | public | novels2 | view | postgres | permanent | 0 bytes | public | test | view | postgres | permanent | 0 bytes | (3 rows)
Можно использовать метакоманду psql
\dm
или \dm+
, чтобы получить список материализованных представлений.
Метакоманда \dm+
предоставляет более подробную информацию.
Schema | Name | Type | Owner | Persistence | Access method | Size | Description --------+-----------+-------------------+----------+-------------+---------------+------------+------------- public | bookshelf | materialized view | postgres | permanent | heap | 8192 bytes | (1 row)
Также можно использовать Information Schema, чтобы получить имя представления, определяющий запрос, значение параметров проверки и другую информацию.
SELECT table_catalog, table_schema, table_name, view_definition, check_option
FROM INFORMATION_SCHEMA.views
WHERE table_schema = ANY (current_schemas(false));
Условие table_schema = ANY (current_schemas(false))
исключает из вывода системные представления.
Результат:
table_catalog | table_schema | table_name | view_definition | check_option ---------------+--------------+-----------------------+-----------------------------------------------------+-------------- bookstore | public | test | SELECT 'Test'::text; | NONE bookstore | public | novels2 | SELECT all_novels_from_books.book_id, +| CASCADED | | | all_novels_from_books.title, +| | | | all_novels_from_books.author_id, +| | | | all_novels_from_books.public_year, +| | | | all_novels_from_books.genre, +| | | | all_novels_from_books.evaluation, +| | | | all_novels_from_books.price +| | | | FROM all_novels_from_books +| | | | WHERE (all_novels_from_books.public_year < 1959); | bookstore | public | all_novels_from_books | SELECT books.book_id, +| NONE | | | books.title, +| | | | books.author_id, +| | | | books.public_year, +| | | | books.genre, +| | | | books.evaluation, +| | | | books.price +| | | | FROM books +| | | | WHERE ((books.genre)::text = 'novel'::text); | (3 rows)
Для отображения параметров материализованных представлений используйте pg_matviews.
SELECT * from pg_matviews;
Результат:
schemaname | matviewname | matviewowner | tablespace | hasindexes | ispopulated | definition ------------+-------------+--------------+------------+------------+-------------+------------------------------- public | bookshelf | postgres | | f | t | SELECT b.book_id, + | | | | | | b.title, + | | | | | | b.public_year, + | | | | | | a.name, + | | | | | | b.genre + | | | | | | FROM books b, + | | | | | | author a + | | | | | | WHERE (b.author_id = a.id); (1 row)
Системные представления
PostgreSQL включает встроенные системные представления. Некоторые представления предоставляют доступ к часто используемым запросам к системным каталогам, другие возвращают параметры внутреннего состояния сервера. Например, pg_settings
отображает runtime-параметры сервера, pg_roles
содержит информацию о ролях базы данных, а pg_matviews
— о материализованных представлениях.
Название | Описание |
---|---|
Доступные расширения |
|
Доступные версии расширений |
|
Контекст памяти обслуживающего процесса |
|
Параметры конфигурации, используемые при компиляции |
|
Доступные курсоры |
|
Сводка содержимого файла конфигурации |
|
Группы пользователей баз данных |
|
Сводка содержимого файла конфигурации аутентификации клиентов |
|
Индексы |
|
Блокировки, установленные или ожидаемые в данный момент |
|
Материализованные представления |
|
Политики |
|
Подготовленные операторы |
|
Подготовленные транзакции |
|
Публикации и связанные с ними таблицы |
|
Информация об источниках репликации, включая данные прогресса репликации |
|
Информация о слотах репликации |
|
Роли |
|
Правила |
|
Метки безопасности |
|
Последовательности |
|
Значения параметров |
|
Пользователи базы данных |
|
Блоки, выделенные в общей памяти |
|
Статистика планировщика |
|
Расширенная статистика планировщика |
|
Расширенная статистика планировщика по выражениям |
|
Таблицы |
|
Аббревиатуры часовых поясов |
|
Имена часовых поясов |
|
Пользователи базы данных |
|
Сопоставления пользователей |
|
Представления |
PostgreSQL также включает несколько дополнительных представлений, которые обеспечивают доступ к результатам сборщика статистики, см. Collected statistics views.
Обратите внимание, что информационная схема предоставляет альтернативный набор представлений, которые перекрывают функциональность системных представлений. Поскольку информационная схема соответствует стандарту SQL, а описанные выше представления есть только в PostgreSQL, лучше использовать информационную схему, если она содержит всю необходимую информацию.