参考:PostgreSQL12 - Chapter 40. The Rule System
一个视图是对应于一个SQL查询语句的一个名称,该名称可以像表名一样用于查询(不能用于增删改);视图只保存SQL查询语句,不保存数据。
视图的创建语句如下:
CREATE VIEW myview AS SELECT * FROM mytab;实际上,以上视图创建语句的内部实现如下:
CREATE TABLE myview (same column list as mytab);
CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
SELECT * FROM mytab;这种实现方式有一些副作用。其中一个副作用是:PostgreSQL 系统目录中有关视图的信息与表的信息完全相同。因此,对于解析器,表和视图之间完全没有区别,它们是一回事:关系(relation)。
(待续...)
上面演示了规则系统如何将视图定义合并到原始查询树中。在第二个示例中,一个视图中的简单 SELECT 创建了一个最终查询树,该树是 4 个表的联接(单位使用两次,名称不同)。
使用规则系统实现视图的好处是:规划器拥有有关必须扫描哪些表的所有信息,以及这些表之间的关系,以及视图的限制性限定以及单个查询树中的原始查询。当原始查询已经是联接视图时,这种情况仍然存在。规划者必须决定哪个是执行查询的最佳路径,并且规划器拥有的信息越多,这个决定就越好。在 PostgreSQL 中实现的规则系统可确保,至此,有关查询的所有可用信息。
物化视图,和视图一样一个SQL查询语句对应的一个名称,可以像表名一样用于查询;但是物化视图会将结果像表一样保存起来,物化视图后续无法直接更新数据;
--物化视图和表的区别
--表的数据是直接实时更新
CREATE TABLE mymatview AS SELECT * FROM mytab;
--物化视图的数据不能直接更新
CREATE MATERIALIZED VIEW mymatview AS SELECT * FROM mytab;
--物化视图需要通过如下命令更新数据:
REFRESH MATERIALIZED VIEW mymatview;物化视图,和视图一样通过规则系统实现;用于创建物化视图的查询语句与创建视图的查询语句,两者的保存方式完全相同。
PostgreSQL 系统目录中,有关物化视图的信息与表/视图的信息完全相同。因此,对于解析器来说,物化视图和表/视图一样,是一个关系。在查询中引用物化视图时,数据直接从物化视图返回,就像从表中返回数据;规则仅用于填充物化视图。
对存储在物化视图中的数据的访问,通常比直接访问基础表或通过视图访问基础表快得多,但是,数据并不总是最新的。
1 有些使用场景中不需要当前最新数据。
--考虑记录销售额的表:
CREATE TABLE invoice (
invoice_no integer PRIMARY KEY,
seller_no integer, -- ID of salesperson
invoice_date date, -- date of sale
invoice_amt numeric(13,2) -- amount of sale
);
--如果人们希望能够快速绘制历史销售数据图,他们可能想要汇总,并且他们可能不关心当前日期的不完整数据
CREATE MATERIALIZED VIEW sales_summary AS
SELECT
seller_no,
invoice_date,
sum(invoice_amt)::numeric(13,2) as sales_amt
FROM invoice
WHERE invoice_date < CURRENT_DATE
GROUP BY
seller_no,
invoice_date
ORDER BY
seller_no,
invoice_date;
CREATE UNIQUE INDEX sales_summary_seller
ON sales_summary (seller_no, invoice_date);
--此物化视图,在为销售人员创建的仪表板中展示图像,可能是很有用的。
--可以安排一个作业,以便每晚使用此 SQL 语句更新统计信息:
REFRESH MATERIALIZED VIEW sales_summary;2 物化视图的另一个用途是:允许通过FDW更快地访问从远程系统传递的数据。
下面列出了一个使用file_fdw(带计时)的简单示例,但由于这是使用本地系统上的缓存,因此与访问远程系统相比的性能差异通常大于此处所示。请注意,我们还利用了在物化视图上放置索引的能力,而 file_fdw 不支持索引;这种优势可能不适用于其他类型的FDW。
--创建fdw
CREATE EXTENSION file_fdw;
CREATE SERVER local_file FOREIGN DATA WRAPPER file_fdw;
--创建外部表
CREATE FOREIGN TABLE words (word text NOT NULL)
SERVER local_file
OPTIONS (filename '/usr/share/dict/words');
--基于外部表创建物化视图
CREATE MATERIALIZED VIEW wrd AS SELECT * FROM words;
CREATE UNIQUE INDEX wrd_word ON wrd (word);
CREATE EXTENSION pg_trgm;
CREATE INDEX wrd_trgm ON wrd USING gist (word gist_trgm_ops);
VACUUM ANALYZE wrd;
--如果可以定期将远程数据更新到本地数据库,则性能优势可能很大。
REFRESH MATERIALIZED VIEW wrd;来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3155046/ ,如需转载,请注明出处,否则将追究法律责任。