Name
PREPARE--创建一个准备好的查询PREPARE plan_name [ (datatype [,...] ) ] AS statement
描述
PREPARE创建一个已准备好的查询。 一个已准备好的查询是服务器端的对象,可以用于优化性能。 在执行PREPARE语句的时候,指定的查询被分析,重写以及规划。 当随后发出EXECUTE语句的时候, 已准备好的查询就只需要执行了。因此,分析,重写,以及规划阶段都只执行一次,而不是每次查询执行的时候都要执行一次。
准备好的查询可以接受参数:在它执行的时候替换到查询中的数值。 要给一个准备好的查询声明参数,我们需要在PREPARE语句里包含一个数据类型的列表。在查询本身里,你可以按照位置来引用这些参数, 比如$1,$2,等。 在执行查询的时候,在EXECUTE语句里为这些参数声明实际的数值。 参考EXECUTE获取更多信息。
准备好的查询是在本地存储的(在当前后端里),并且只是在当前数据库会话的过程中存在。 如果客户端退出,那么准备好的查询就会被遗忘,因此我们必须在被重新使用之前重新创建。 这也意味着一个准备好的查询不能被多个同时的数据库客户端使用; 但是,每个客户端可以创建它们自己的已准备好的查询来使用。已准备好的语句可以用DEALLOCATE命令手工清除。
如果一个会话准备用于执行大量类似的查询,那么已准备好的查询可以获得最大限度的性能优势。 如果查询非常复杂,需要复杂的规划或者重写,那么性能差距将非常明显。 比如,如果查询设计许多表的连接,或者有多种规则要求应用。如果查询的规划和重写相对简单, 而执行起来开销相当大,那么已准备好的查询的性能优势就不那么明显。
plan_name
在一些情况下,Postgresql为一个已准备好的查询生成的查询规划可能还不如按照普通方法提交并执行的查询生成的规划好。 这是因为该查询在被规划的时候(也是优化器视图判断最优查询规划的时候), 在查询中声明的任何参数的实际数值都还不可见。Postgresql在表中收集数据分布的统计, 而且可以利用查询中的常量来猜测执行查询的可能结果。 因为这些数据在准备哪种带参数的查询的规划的时候还不可得, 所以,选出来得规划可能是次好的。 要检查Postgresql为已准备好的查询选取的查询计划, 使用EXPLAIN。