PREPARE
PREPARE — 为执行准备一个语句
大纲
PREPAREplan_name[ (datatype[, ...] ) ] ASstatement
描述
PREPARE 创建一个预备语句。预备语句是一种可用于优化性能的服务器端对象。执行 PREPARE 语句时,指定的语句会被解析、重写和规划。随后对预备语句发出 EXECUTE 命令时,只需执行该预备语句即可。这样,解析、重写和规划阶段只执行一次,而不是每次执行语句时都进行。
预备语句可以带参数,也就是在执行时会代入语句中的值。要在预备语句中使用参数,需要在PREPARE语句中提供一个数据类型列表,并在被预备的语句本身中,使用$1、$2
等按位置引用这些参数。执行该语句时,需要在
EXECUTE语句中为这些参数指定实际值。有关详情,参见EXECUTE。
预备语句只在当前数据库会话期间存储并存在。当会话结束时,预备语句就被遗忘,因此再次使用之前必须重新创建它。这也意味着单条预备语句不能被多个同时的数据库客户端使用;不过,每个客户端都可以创建自己的预备语句来使用。
当单个会话要执行大量相似语句时,预备语句能带来最大的性能优势。如果语句在规划或重写时比较复杂,例如查询涉及许多表的连接,或者需要应用多条规则,那么这种性能差异会特别明显。如果语句相对容易规划和重写,但执行本身代价较高,则预备语句带来的性能优势就不那么明显。
参数
plan_name为这个特定预备语句指定的任意名称。它在单个会话内必须唯一,随后用于执行或释放先前已准备的语句。
datatype预备语句中某个参数的数据类型。要在预备语句本身中引用参数,可使用
$1、$2等。statement任何
SELECT、INSERT、UPDATE或DELETE语句。
注解
在某些情况下,为预备语句生成的查询计划可能劣于正常提交并执行该语句时生成的计划。这是因为在对语句做规划且规划器试图确定最优查询计划时,语句中指定的任何参数的实际值都不可用。PostgreSQL 收集表中数据分布的统计信息,并可以利用语句中的常量值来猜测执行该语句的可能结果。由于带参数的预备语句在规划时这些数据不可用,所选的计划可能是次优的。要查看
PostgreSQL 为预备语句选择的查询计划,可以使用 EXPLAIN EXECUTE。
有关查询规划以及 PostgreSQL 为此收集的统计信息的更多内容,请参见ANALYZE文档。
兼容性
SQL 标准包含PREPARE语句,但它只用于嵌入式 SQL。这里的PREPARE语句在语法上也略有不同。