ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PostgreSQL 通过Prepare语句进行软解析

PostgreSQL 通过Prepare语句进行软解析

原创 Linux操作系统 作者:jolly_liu 时间:2010-04-08 17:24:06 0 删除 编辑
Prepare语句进行软解析
 
在PostgreSQL中,同一个session的所有SQL statements都要进行一遍parse,rewrite,plan的过程。即使在当前语句之前已经执行过相同的语句,也需要重新解析。
 
PostgreSQL通过Prepare语句来解决同一session中软解析的问题。
 
一、Prepare原理
1.创建一个server-side的prepare对象。
2.当第一次execute时,他会parsed, rewritten, 以及planned.
3.以后再execute时,就直接执行,不再进行上面的3个动作。
 
二、适用情况(在以下情况下使用性能会有很大提升)
1、在同一个session中执行大量的相同或相似的语句。
2、并且语句非常复杂(如join很多表,查询的SQL几百行等),这些在plan和rewrite的时候会非常费时。
总体来说在复杂的查询分析中比较适合。
 
三、不适用情况
如果在plan和rewrite的时候简单,但执行的时候非常耗费资源,则不适用
(比如update tb1 set aa='1' where id>10,这一句在plan的时候会非常容易,但如果执行的时候涉及到10w条记录,则执行会非常消耗资源,这就属于这种不适用的情况。)
 
四、Notes
1、Prepared语句只在session的整个生命周期中存在,一旦session结束,Prepared语句也不存在了。如果下次再使用需重新创建。
2、Prepared语句不能在多个并发的client中共有。
3、prepared语句可以通过DEALLOCATE命令清除。
4、查看当前session的prepared语句:pg_prepared_statements
 
五、测试实例
实例1:
PREPARE fooplan (int, text, bool, numeric) AS INSERT INTO foo VALUES($1, $2, $3, $4); EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
实例2:
prepare select_emp(int) as
 select * from emp_test where e_empno=$1;
EXECUTE select_emp(128);
edb=# select * from pg_prepared_statements;
-[ RECORD 1 ]---+-----------------------------------------------------------------------
name                    | select_emp22
statement            | prepare select_emp22(int) as  select * from emp_test where e_empno=$1;
prepare_time      | 08-APR-10 17:05:56.28125 +08:00
parameter_types | {integer}
from_sql                | t
 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21778816/viewspace-631631/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-04-08

  • 博文量
    5
  • 访问量
    9262