PostgreSQL的CURSOR SHARING
文章转载自公众号:白鳝的洞穴 作者:白鳝 Oracle DBA最怕遇到CURSOR 相关的问题,如果发生了CURSOR争用导致的性能问题,是很难在短时间内分析清楚的。有时候我们重启数据库就解决了这个问题,不过有时候重启数据库后问题依然存在。幸运的是在PostgreSQL数据库中好像很少会遇到类似的问题,这是什么原因呢? 在一个高并发的系统中,SQL执行过程需要对SQL进行编译,这个过程无论哪种数据库都是必须有的。大体上分为语法语义解析、SQL REWRITE优化、执行计划生成、执行计划选择、执行等过程。在PostgreSQL中,可以用下面这个图来表示。 为了避免每次SQL执行之前都做上述昂贵的操作,Oracle构建了全局共享的CURSOR结构,用于在共享内存(SHARED POOL)中存储CURSOR共享部分的数据,用于所有的会话共享。似乎现在的Mysql、PostgreSQL等开源数据库和一些国产数据库都没有再采用这种全局共享CURSOR的机制,而大多数采用SQL不共享或者会话内共享CURSOR的机制,比如比较新版本的PostgreSQL就是采用会话内共享SQL的机制。 为什么Ora...