PostgreSQL 临时表 1 2 3

2019-12-24 12:48:17 浏览数 (1)

周五的那篇本来没觉得会有那么多人看,回头还有留言的,既然大家都有心理的苦,我是这样想的,想要脱离苦难必然提高自己,光靠我们DBA 自己提高是不OK 的,我们的找开发,从项目中对表设计以及相关的业务逻辑入手,优化表设计,这一般都是开发或架构师的工作,一般的DBA 很难分到这样的工作,或分到也是已经成型的表去优化,无非去加个索引,或者其他的分区表一类的工作,这样对我们的发展不利,下面有一个群,我也会开始找开发加加进来,开发对表的设计大概率是平自己的意志,或者上层的意志来进行设计,大多设计(尤其传统行业)可以优化或修改的点太多了,最近会开始写点一些表优化的方式,联合少量的业务逻辑,希望大家能找一些开发加到群里面,数据库的种类可以更换,ORACLE MYSQL POSTGRESQL SQL SERVER mongodb redis

,但到底怎么设计和优化根据业务的事情这点也和数据库有关,不同类型的数据库的特点不同,所以表设计的方式也不同,大部分开发都不大懂,把ORACLE的表直接照搬到MYSQL(第三方或有些说支持多种数据库的软件公司) ,结果也可想而知。知识的扩展如果懂得数据库种类数量算是横向扩展,那根据业务逻辑来进行表的设计就是纵向发展的一部分,所以希望大家可以帮助,拽人或者加入扩展自己,互相帮助。也十分欢迎开发的同学,we are friend ,help each other.

正文___________________________________________________________________

说到临时表,使用MYSQL的同学可能不是很常用,尤其是互联网领域的,临时表在MYSQL 的主从复制环境中使用临时表本身是有缺陷的(这还的扯到程序当中去,解释起来比较复杂)。今天的主题是Postgresql 的临时表,Postgresql 的临时表本身是事带有隔离性的,与ORACLE 不同的是,PostgreSQL的临时表本身更彻底,在SESSION失效后,表的定义都会消失,ORACLE 则不是,表的定义不会消失。这也是两种数据库在临时表上的区别。

我们可以下载做一个测试,我们开两个窗口

在此之外,我们在开一个窗口

首先证明了每个session 中的临时表都是独立的,在别的SESSION 中是看不到的。

另外PostgreSQL 中的临时表还有一些相关方便的设置,在创建时指定临时表的在什么时候消失或者清理数据。

相关postgresql 可以在 commit 中进行设置例如

代码语言:javascript复制
ON COMMIT DELETE ROWS;
代码语言:javascript复制
ON COMMIT DROP;
代码语言:javascript复制
ON COMMIT PRESERVE ROWS;

这三种分别代表不同的含义,一个是在SESSION内,如果COMMIT 就直接将临时表中的行删除 , DROP 是直接commit 后就将表删除,最后是即使commit 也保留表,直到session结束。

另外POSTGRESQL 中的并行扫描,对临时表是无效的。还有一个有意思的事情时,如果你在同一个事务中创建了同名的临时表 和 实体表,则你访问的和操作的都是临时表优先。

另外有一个地方需要讨论的是,临时表在复杂事务中到底帮了我们多少,

临时表可以降低多表进行关联造成的查询复杂性和性能的问题

例如:临时表可以在程序快速调用存储过程中,分解对大表的访问和查询,将中间的结果存储在临时表中,而不是多个大表进行关联,如果我们仅仅需要查询大表中1%的记录,同时可以通过条件来现将大表1%的数据或更少的数据存储在临时表里面,在进行相关的连接,聚合,等操作,会大大减少例如锁等待,死锁,等可能性。

另外和有些数据库不同,PG的临时表会创建在你当前操作的数据库中,并且以t 开头进行命名(这里指的是在临时表的物理存储空间的名字)

所以更好的利用历史表,能让你的例如存储过程,乃至是程序设计都能提升一个层次,当然如果滥用历史表,在不恰当的场景进行使用,则会事倍功半的结果。

0 人点赞