出于性能原因,我在数据库中有一个物化视图。环境的约束已经改变,现在我需要使更新显示得更快,并且视图本身的性能不太重要。如何将物化视图更改为常规视图?寻找类似的东西:
ALTER MATERIALIZED VIEW viewname TO VIEW
由于实例化视图和视图是数据库中的不同对象,因此您需要删除实例化视图并基于实例化视图创建视图。
您可以通过两种方式从物化视图中显示SELECT
语句:
方式1:使用指令
\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>
而且,瞧。完成手动方式
如果您不能执行复制/粘贴操作,我们可以使用的另一个选项是创建一个函数来转换数据。如下:
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
,我们可以看到从我的测试中提取的物化视图信息,如下图所示。
此函数获取定义,并使用原始实例化视图的DROP MATERIALIZED VIEW
定义执行CREATE MATERIALIZED VIEW
和SELECT
。
因此,如果您已为物化视图建立索引,则需要进行更多控制,因此,如果有任何参考块,则您的物化视图可能不会被排除,并且需要进行额外的控制。