首页 > 其他分享 >pg 物化视图相关

pg 物化视图相关

时间:2023-04-18 13:34:58浏览次数:48  
标签:CONCURRENTLY 视图 物化 索引 pg 刷新 newdata


一、 物化视图简介

类似oracle,pg的物化视图也是物理是实际存在的表。在执行某些查询时效率较低, 而且使用传统方法(例如索引)无法显著提高效率,这时常用的方法是将需要查询的数据事先查好并储存起来, 这样就不需要每次查询都从头执行一次。这种“ 缓存” 机制其实就是物化视图。

CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] table_name
    [ (column_name [, ...] ) ]
    [ USING method ]
    [ WITH ( storage_parameter [= value] [, ... ] ) ]
    [ TABLESPACE tablespace_name ]
    AS query
    [ WITH [ NO ] DATA ]

物化视图类型

特点

对应oracle刷新方式

oracle有而pg无的刷新方式

快照物化视图

snapshot materialized view

最容易实现, 物化视图中的数据需要手动刷新

ON DEMAND(默认):该物化视图“需要”被刷新了,才进行刷新,这里就要求用户手动刷新数据了

  • COMPLETE:全量刷新,相当于重新执行一次创建视图的查询语句

 

  • FORCE(默认):可以使用fast模式时,采用fast方式刷新;否则使用complete方式

 

  • NEVER:不刷新

积极物化视图

Eager materialized view

物化视图在数据库被更新时同步更新,通过系统触发器实现


消极物化视图

Lazy materialized view

物化视图在事务提交时更新

on commit:当主表中有数据提交的时候,立即刷新MV中的数据

非常消极物化视图

Very Lazy materialized view

类似快照物化视图, 区别在于变化都会被增量式地记录下来并在手动刷新时被应用

fast:增量刷新。为记录增量变化,建立增量刷新物化视图还需要创建物化视图日志表

  

二、 物化视图刷新方式

 

1. 物化视图刷新语法

REFRESH MATERIALIZED VIEW [CONCURRENTLY] table_name [WITH [NO] DATA]

方式一:

REFRESH MATERIALIZED VIEW table_name

方式二:

REFRESH MATERIALIZED VIEW CONCURRENTLY table_name

 

2. CONCURRENTLY选项的特点

  • 该参数的原理和优缺点与索引的CONCURRENTLY类似,以时间来换取查询锁,刷新的速度会变慢。
  • 使用CONCURRENTLY选项,可以在刷新时不阻塞对该物化视图的查询,但在多行受影响时刷新速度会下降;
  • 不使用CONCURRENTLY选项时,使用更少的资源并且完成更迅速,但是会锁定其他试图从该物化视图读数据的连接。该选项在少量行受影响时, 可能速度会更快

 

3. 能使用CONCURRENTLY选项的情况

  • 物化视图上必须至少有一个仅包含列名(不是函数索引等)且包含所有行(不是选择索引)的UNIQUE索引,否则会报错
  • 物化视图未被填充时,不能使用该选项,否则会报错
  • 即使使用了CONCURRENTLY选项,每次也只能刷新一个物化视图(只是在刷新时不阻塞读当前物化视图,但多个物化视图刷新语句还是不能并发执行)

 

三、 物化视图刷新实现

1. 入口函数

ExecRefreshMatView(RefreshMatViewStmt *stmt,const char *queryString,ParamwListInfo params, char *completionTag)

typedef struct RefreshMatViewStmt
{
NodeTag type;
bool concurrent;
bool skipData;
RangeVar *relation;
} RefreshMatViewStmt;

 

2. ExecRefreshMatView函数

pg 物化视图相关_数据

方式一( 无concurrently选项)

  • 设置锁的模式:访问排他锁 AccessExclusiveLock
  • 正确性检查
  • 创建临时表
  • 调用refresh_by_heap_swap函数完成刷新

方式二( 有concurrently选项)

  • 设置锁的模式:排他锁 Exclusivelock
  • 正确性检查
  • 唯一索引检查
  • 创建临时表空间
  • 创建临时表
  • 调用refresh_by_match_merge函数完成刷新

 

3. refresh_by_heap_swap

通过交换原来的表和临时表的物理文件, 并重新建立索引, 完成刷新

pg 物化视图相关_数据_02

 

4. refresh_by_match_merge

通过原来的表与临时表外部连接, 根据连接结果得到两个表的差异(创建差异表), 并做删除操作, 接着再做插入操作, 来完成刷新, 最后删除临时表

 

pg 物化视图相关_oracle_03

 

5. refresh_by_match_merge刷新实现步骤及原理

原表与临时表

pg 物化视图相关_数据_04

创建差异表

CREATE TEMP TABLE diffname AS 
SELECT mv.ctid AS tid, newdata FROM matviename mv FULL JOIN tempname newdata ON (newdata.tid=mv.tid AND newdata = mv) 
WHERE newdata IS NULL OR mv IS NULL 
ORDER BY tid;

pg 物化视图相关_物化视图_05

删除原表已被更新数据

DELETE FROM matviewname mv WHERE ctid = ANY (SELECT diff.tid FROM diffname diff
WHERE diff.tid IS NOT NULL AND diff.newdata IS NULL);

 

pg 物化视图相关_物化视图_06

将更新的数据插回原表

INSERT INTO matviewname SELECT (diff.newdata).* FROM diffname diff WHERE tid IS NULL;


pg 物化视图相关_oracle_07

删除差异表和临时表

Drop table diffname,tempname;

pg 物化视图相关_数据_08

 

四、 物化视图示例

pg 物化视图相关_数据_09

pg 物化视图相关_数据_10

 

五、 重建索引

PG12引入REINDEX CONCURRENTLY,以解决在REINDEX期间不能执行查询的问题,锁模式设置为Share Update ExclusiveLock。

pg 物化视图相关_物化视图_11

其实现思路如下:

  • 在系统表中创建新的索引
  • 构建新索引
  • 使新索引与在构建期间出现的变化同步(catch up)
  • 重命名新索引为旧索引的名称,并切换所有依赖旧索引的地方到新索引,旧索引设置为invalid
  • 标记旧索引为dead状态
  • 删除旧索引

 

参考

pg 物化视图相关_oracle_12

https://www.postgresql.org/docs/12/sql-refreshmaterializedview.html


标签:CONCURRENTLY,视图,物化,索引,pg,刷新,newdata
From: https://blog.51cto.com/u_13631369/6203183

相关文章

  • pg 崩溃恢复篇(一)—— WAL的作用与全页写机制
    WAL(WriteAheadLog)机制最初在7.1版中实现,以减轻服务器崩溃的影响。它也是基于时间点恢复(PITR)和流复制(SR)实现的基础。WAL机制非常复杂,在第一篇中,我们只看看为什么需要WAL,它有什么作用,又会有什么不足。一、 没有WAL的插入操作要看为什么需要有WAL,那就先看看如果没有会怎么样。假设......
  • pg 崩溃恢复篇(二)—— WAL文件结构及管理
    第二篇我们来看WAL文件逻辑、物理结构以及管理方法。一、事务日志和WAL文件1.命名规则    在逻辑上,pg用一个地址空间长度为8B的虚拟文件表示事务日志(最大可达16EB)。pg中的事务日志默认切分为16MB的文件,每个文件称为WAL段。pg11开始,使用initdb命令初始化时可以使用–wal......
  • pg 如何生成创建表sql语句?
    oracle有dbms_metadata.get_ddl;sqlserver可以直接右键;mysql有showcreatetable但pg好像没有直接的方法,网上找到了几种自己创建函数的方法,收集一下。法一:支持生成包含:字段(支持数组类型字段)、约束、索引(支持唯一索引、全类型索引)在内的建表语句。CREATEORREPLACEFUNCTION"public......
  • pg 10 主要参数配置整理
    一、查看参数设置show参数名select*frompg_settingswherename='参数名';查看 postgresql.conf文件  二、参数是否可修改pg中主要可优化参数都位于postgresql.conf文件中,其中参数是否可修改可通过pg_settings的context字段查询。postgres=#selectdistinctcontextfrom......
  • pg 物理架构
    架构图各部分用途......
  • pg事务篇(一)—— 事务与多版本并发控制MVCC
    一、MVCC常用实现方法一般MVCC有2种实现方法:写新数据时,把旧数据快照存入其他位置(如oracle的回滚段、sqlserver的tempdb)。当读数据时,读的是快照的旧数据。写新数据时,旧数据不删除,直接插入新数据。PostgreSQL就是使用的这种实现方法。1.PostgreSQL的MVCC实现方式优缺点优点无论事务......
  • Oracle 单进程可用PGA为4G限制导致的ORA-4030报错
    一、问题背景收到开发反馈,系统报表运行过程中报错,一看发现是ORA-4030,内存的问题查看alert日志,发现期间有大量ORA-4030报错,并且主要是pga相关的打开trace文件,可以看到报错进程使用内存接近4G但是查看pga参数设置,发现设置的上限是20G,完全没到,并且期间总的PGA使用率也不高 二、报错......
  • 【FPGA】vivado使用时的问题汇总
    今天在使用vivado的时候,出现了之前的错误,但是我忘记了解决方案,只能再去网上找方法。所以我建了个这个问题汇总博客,以后再碰到问题可以先来这里翻一翻。1、MIGIP核在重新打开工程的时候会丢失一些文件,导致无法仿真,需要重新生成一遍IP核才能够正常使用。同样的,在OpenIPExample......
  • Oracle 物化视图
    oracle中常常会用物化视图来同步数据或者迁移数据。在dbms_mview中刷新过程,可以使用并行刷新的特性,这样有效的减少了完全刷新的时间。dbms_mview('表名','F')快速刷新,也是增量刷新,即只对异动数据进行刷新dbms_mview('表名','C')完全刷新步骤:creatematerializedviewl......
  • 【FPGA 仿真和调试脚本】常用系统任务
    一、显示任务$display和$write系统显示任务$display和$write在仿真测试中是最为常用的信息显示方式。$display和$write任务最主要的区别在于,$display在一次输出后会自动换行,而$write则不会,他们的其他用法格式基本类似。【语法结构】【任务名】(“【可选字符串】+【格式】”,【信......