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
五、测试实例
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
-[ 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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21778816/viewspace-631631/