侧边栏壁纸
博主头像
liuxy博主等级

细水长流,吃穿不愁

  • 累计撰写 39 篇文章
  • 累计创建 30 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

【PostgreSQL】物化视图、事务

liuxy
2023-02-26 / 0 评论 / 0 点赞 / 517 阅读 / 1,003 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-02-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1、表空间问题

在制定了表空间的情况下,在PGSQL的默认目录下存储的是一个link(链接)文件

2、物化视图

普通的视图本质上是一个SQL,并不会在本地磁盘上存储任何数据,每次查询都会执行这个SQL,所以较为复杂的SQL就回降低查询效率。

  • 物化视图必然是要持久化数据,其本质是一个Table,这样,查询物化视图就相当于查询一张表,相比普通视图,不需要每次查询复杂SQL。
  • 物化视图因为持久化到本地,完全脱离原来的表结构。
  • 物化视图是可以单独设置索引等信息,来提升查询效率。
    缺陷:
  • 数据更新时间不好把控,如果频繁更新,对数据库压力增大。如果更新不频繁,会造成数据延时问题,实时性比较差。

数据更新: 触发器、定时任务

语法

\help create materialized view
-- 构建物化视图
create materialized view mv_test
as
(select id, name, pice from test_table);
-- 查询物化视图
select * from mv_test;

操作物化视图和和表没有区别
操作原表时,对物化视图没有任何影响
不允许对物化视图手动添加数据(回报错)

如何同步物化视图数据

PostgreSQL中,对物化视图的数据同步,提供了两种方式:

  1. 全量更新:
-- 全量更新
refresh materialized view mv_test;
  1. 增量更新:
    因为物化视图没有唯一索引,无法判断出哪些数据时增量数据,所以必须要给物化视图添加唯一索引。
-- 添加唯一索引
create unique index idx_mv_test_id on vm_test(id);
-- 增量更新
refresh materialized view concurrently mv_test;

增量更新时,即便是修改数据,物化视图的同步会根据xmin的字段进行同步数据。

3、事务

什么是ACID

在日常操作中,对于一组相关操作,,通常要求要么都成功,要么都失败。在关系型数据库中,称这组操作作为事务。
为了保证整体事务的安全性,就提出了ACID的说法:

  • 原子性A:
  • 一致性C:
  • 隔离型I:
  • 持久性D:

PostgreSQL中,在事务的并发问题中,也是居于MVCC多版本并发控制去维护数据的一致性。相比于传统的锁操作,MVCC最大的优点就是可以让读写互不冲突。
当然,PostgreSQL也是支持表锁和行锁,可以解决写写冲突问题。
PostgreSQL相比于其他数据库,有一个比较大的优化,DDL也可以包含在一个事务中。比如:集群中的操作,一个事务可以保证多个节点都构建出一个表,才算成功。

1、事务的基本使用

PostgreSQL的事务是自动提交的。当然可以手动关闭。

\set AUTOCOMMIT off

但是这种方式比较麻烦。

事务相关的命令:

  • begin: 开启事务
  • commit: 提交事务
  • rollback:回滚事务

2、保存点

比如项目中有一个大事务操作,不好控制,超时有影响,回滚会操成一切重来,成本太高。
针对大事务,拆分成几个部分,第一部分完成后,构建一个保存点。如果后面操作失败,需要回滚,不需要全盘回滚,回滚到之前的保存点继续重试。

语法:

savepoint ok1;

rollback to savepoint ok1;

4、并发问题

1、事务的隔离级别

事务并发引发的问题:

  • 脏读
  • 不可重复读
  • 幻读
0
广告 广告

评论区