Изменить материализованный вид на обычный - PullRequest
1 голос
/ 17 апреля 2020

У меня есть материализованное представление в моей базе данных по соображениям производительности. Ограничения среды изменились, и теперь мне нужно, чтобы обновления появлялись быстрее, а производительность самого представления менее важна. Как я могу изменить материализованное представление вместо обычного? Ищу что-то вроде:

ALTER MATERIALIZED VIEW viewname TO VIEW

1 Ответ

3 голосов
/ 17 апреля 2020

Подход 1: Ручной метод копирования / вставки


Поскольку материализованное представление и представление являются различными объектами в вашей базе данных, вам необходимо удалить материализованное представление и создать представление на основе вашего материализованного представления.

Вы можете показать оператор SELECT из своего материализованного представления двумя способами:

Способ 1: Используя директиву

\d+ viewname

Способ 2: Выполните SELECT для внутренних таблиц

SELECT definition FROM pg_matviews WHERE matviewname='viewname';

Обе команды, перечисленные выше, покажут SELECT, использованное в вашем материализованном представлении, поэтому вы можете скопировать в текстовый редактор, чтобы вставить before.

Следующий шаг - DROP материализованное представление и создание нового просто как:

DROP MATERIALIZED VIEW viewname;

Последний шаг - завершение представления:

CREATE VIEW viewname AS <paste your SELECT statement here>

И, вуаля. Это делается вручную

Подход 2. Автоматический переход от matview к просмотру с помощью функции


Другой вариант, который мы можем использовать, если вы не можете копировать / вставлять, - это создать функция для преобразования данных. следующим образом:

CREATE TABLE mytable (id int, name varchar);
INSERT INTO mytable (1, 'John');
INSERT INTO mytable (2, 'Mary');

Создано над mytable в качестве примера

CREATE MATERIALIZED VIEW mymatview1 AS SELECT * FROM mytable;

Создано материализованное представление на основе mytable.

CREATE OR REPLACE FUNCTION frommaviewttoview(VARCHAR) 
RETURNS VOID as $$
    DECLARE
      mymatview ALIAS FOR $1; 
      tomatview VARCHAR;
    BEGIN
        SELECT definition INTO tomatview
          FROM pg_matviews
         WHERE matviewname=$1;
       EXECUTE 'DROP MATERIALIZED VIEW '||mymatview;
       EXECUTE 'CREATE VIEW '||mymatview||' AS '||tomatview;
    END;
$$ LANGUAGE plpgsql;

Создана функция для преобразования материализованное представление для просмотра

\d

И, с помощью \d мы можем видеть материализованную информацию представления, как показано на рисунке ниже, извлеченную из моих тестов.

View converted as example

Эта функция получает определение и выполняет DROP MATERIALIZED VIEW и CREATE MATERIALIZED VIEW с определением SELECT исходного материализованного представления.

Итак, вам нужно больше контролировать, если вы проиндексировали материализованные представления, поэтому, если какие-либо ссылочные блоки, ваше материализованное представление, вероятно, не будет исключено, и необходимо будет выполнить дополнительные элементы управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...