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中,对物化视图的数据同步,提供了两种方式:
- 全量更新:
-- 全量更新
refresh materialized view mv_test;
- 增量更新:
因为物化视图没有唯一索引,无法判断出哪些数据时增量数据,所以必须要给物化视图添加唯一索引。
-- 添加唯一索引
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、事务的隔离级别
事务并发引发的问题:
- 脏读
- 不可重复读
- 幻读
评论区