将实体化视图更改为常规视图
Change materialized view to regular view
出于性能原因,我的数据库中有一个物化视图。环境的约束已经改变,现在我需要让更新出现得更快,视图本身的性能变得不那么重要了。如何将物化视图更改为常规视图?寻找类似的东西:
ALTER MATERIALIZED VIEW viewname TO VIEW
方法 1:手动 copy/paste 方法
由于实体化视图和视图在您的数据库中是不同的对象,您需要删除实体化视图并根据您的实体化视图创建视图。
您可以通过两种方式显示实体化视图中的 SELECT
语句:
方式一:使用指令
\d+ viewname
方法 2: 对内部表执行 SELECT
SELECT definition FROM pg_matviews WHERE matviewname='viewname';
上面列出的两个命令都会显示在实体化视图上使用的SELECT
,因此,您可以在文本编辑器中复制粘贴。
下一步是 DROP
物化视图并创建新的简单的视图:
DROP MATERIALIZED VIEW viewname;
最后一步是创建视图:
CREATE VIEW viewname AS <paste your SELECT statement here>
然后,瞧。手动方式已完成
方法二:通过函数自动从matview切换到view
如果您做不到,我们可以使用的另一个选项 copy/paste 是创建一个函数来转换数据。如下:
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 ;
tomatview VARCHAR;
BEGIN
SELECT definition INTO tomatview
FROM pg_matviews
WHERE matviewname=;
EXECUTE 'DROP MATERIALIZED VIEW '||mymatview;
EXECUTE 'CREATE VIEW '||mymatview||' AS '||tomatview;
END;
$$ LANGUAGE plpgsql;
创建了将实体化视图转换为视图的函数
\d
并且,使用 \d
我们可以看到如下图所示的实体化视图信息,这些信息是从我的测试中提取的。
此函数获取定义并执行DROP MATERIALIZED VIEW
和CREATE MATERIALIZED VIEW
与SELECT
原始实体化视图的定义。
因此,如果您有索引实体化视图,则需要采取更多控制措施,因此,如果有任何引用块,您的实体化视图可能不会被排除,并且需要进行额外的控制。
出于性能原因,我的数据库中有一个物化视图。环境的约束已经改变,现在我需要让更新出现得更快,视图本身的性能变得不那么重要了。如何将物化视图更改为常规视图?寻找类似的东西:
ALTER MATERIALIZED VIEW viewname TO VIEW
方法 1:手动 copy/paste 方法
由于实体化视图和视图在您的数据库中是不同的对象,您需要删除实体化视图并根据您的实体化视图创建视图。
您可以通过两种方式显示实体化视图中的 SELECT
语句:
方式一:使用指令
\d+ viewname
方法 2: 对内部表执行 SELECT
SELECT definition FROM pg_matviews WHERE matviewname='viewname';
上面列出的两个命令都会显示在实体化视图上使用的SELECT
,因此,您可以在文本编辑器中复制粘贴。
下一步是 DROP
物化视图并创建新的简单的视图:
DROP MATERIALIZED VIEW viewname;
最后一步是创建视图:
CREATE VIEW viewname AS <paste your SELECT statement here>
然后,瞧。手动方式已完成
方法二:通过函数自动从matview切换到view
如果您做不到,我们可以使用的另一个选项 copy/paste 是创建一个函数来转换数据。如下:
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 ;
tomatview VARCHAR;
BEGIN
SELECT definition INTO tomatview
FROM pg_matviews
WHERE matviewname=;
EXECUTE 'DROP MATERIALIZED VIEW '||mymatview;
EXECUTE 'CREATE VIEW '||mymatview||' AS '||tomatview;
END;
$$ LANGUAGE plpgsql;
创建了将实体化视图转换为视图的函数
\d
并且,使用 \d
我们可以看到如下图所示的实体化视图信息,这些信息是从我的测试中提取的。
此函数获取定义并执行DROP MATERIALIZED VIEW
和CREATE MATERIALIZED VIEW
与SELECT
原始实体化视图的定义。
因此,如果您有索引实体化视图,则需要采取更多控制措施,因此,如果有任何引用块,您的实体化视图可能不会被排除,并且需要进行额外的控制。