ITPub博客

首页 > > > PostgreSQL 规则&视图、物化视图&外部数据包装器

PostgreSQL 规则&视图、物化视图&外部数据包装器

作者:浪花小雨滴 时间:2020-06-17 16:44:54 0 删除 编辑

参考:PostgreSQL12 - Chapter 40. The Rule System

  • 规则Rule
  • 视图View
  • 物化视图Material View
  • 外部数据包装器 Foreign Data Wrapper

视图的外观:

一个视图是对应于一个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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39957