学习笔记 - 关于postgres软解析

周末在家趁孩子睡午觉,学习一会postgres,这个号称可以取代oracle数据库的开源数据库,一直以来关注着。oracle工作学习中让人印象深刻和比较难以琢磨领悟的就是软解析和硬解析。那么postgres里面这块是怎么样的呢?和oracle又有哪些区别呢?

其中最大的区别就是oracle里面有sga共享缓存区的概念:

而postgres里面么有这个概念,postgres里面进程之间都是不共享资源的,

网上关于oracle软解析硬解析的例子特别多,但是postgres的就比较少,很多都是多年前的,我参考之下,在最新的pg12上面测试了下软解析。

一,先介绍下postgres软解析

在PostgreSQL中,同一个session的所有SQL statements都要进行一遍parse,rewrite,plan的过程。即使在当前语句之前已经执行过相同的语句,也需要重新解析,PostgreSQL通过Prepare语句来解决同一session中软解析的问题。

1、Prepare原理
a.创建一个server-side的prepare对象。
b.当第一次execute时,他会parsed, rewritten, 以及planned.
c.以后再execute时,就直接执行,不再进行上面的3个动作。
 
2、适用情况(在以下情况下使用性能会有很大提升)
a、在同一个session中执行大量的相同或相似的语句。
b、并且语句非常复杂(如join很多表,查询的SQL几百行等),这些在plan和rewrite的时候会非常费时。
总体来说在复杂的查询分析中比较适合。
 

3、不适用情况
如果在plan和rewrite的时候简单,但执行的时候非常耗费资源,则不适用
(比如update tb1 set aa='1' where id>10,这一句在plan的时候会非常容易,但如果执行的时候涉及到10w条记录,则执行会非常消耗资源,这就属于这种不适用的情况。)
 
4、需要注意的地方
a、Prepared语句只在session的整个生命周期中存在,一旦session结束,Prepared语句也不存在了。如果下次再使用需重新创建。
b、Prepared语句不能在多个并发的client中共有。
c、prepared语句可以通过DEALLOCATE命令清除。
d、查看当前session的prepared语句:pg_prepared_statements

二,postgres软解析例子

postgres软解析的例子,比较少。

a 字符串的绑定变量

PREPARE  select_mapid(varchar) as select * from bl_jianghai where mapid=$1;

EXECUTE select_mapid('460912x63');

b 数字的绑定变量

PREPARE  select_mapid(int) as select * from bl_jianghai where age <$1 and age >$2;

EXECUTE select_mapid(18,30);

猜你喜欢

转载自blog.csdn.net/mchdba/article/details/108457284
今日推荐