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