↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

PREPARE

PREPARE — 创建一个预备查询

大纲

   PREPARE plan_name [ (datatype [, ...] ) ] AS query
  

输入

plan_name

给这条特定预备查询起的任意名称。它 在单个会话内必须唯一,用于执行 或删除一条先前预备的查询。

datatype

预备查询的某个参数的数据类型。 要在预备查询自身中引用参数, 可以使用 $1、$2 等。

输出

→ PREPARE

查询已成功预备。

描述

PREPARE 创建一条预备查询。预备 查询是一种可以用来优化性能的服务器端 对象。当执行 PREPARE 语句时, 指定的查询会被解析、重写和 规划。当随后发出 EXECUTE 语句时, 只需执行该预备查询即可。这样, 解析、重写和规划阶段只执行一次, 而不是每次执行查询时都执行。

预备查询可以带参数:即在执行查询时 替换进查询里的值。要为预备查询指定 参数,在 PREPARE 语句中 附上一个数据类型列表。在查询自身中,你 可以用 $1、$2 等 按位置引用参数。执行 查询时,在 EXECUTE 语句中为这些参数 指定实际值——更多信息 请参考 EXECUTE。

预备查询存储在本地(当前后端中),并且 只在当前数据库会话期间存在。当 客户端退出时,预备查询就被遗忘,因此再次 使用之前必须重新创建它。这也意味着单条 预备查询不能被多个同时的数据库 客户端使用;不过,每个客户端都可以创建自己的 预备查询来使用。

当单个后端被用来执行大量相似的 查询时,预备查询的性能优势最大。如果 查询的规划或重写很复杂,性能差异会特别 显著。例如,查询涉及多表的连接或需要 应用若干规则时。如果查询相对容易 规划和重写但执行开销相对较大,预备 查询的性能优势就不那么明显。

注解

在某些情况下,PostgreSQL 为预备查询 生成的查询计划可能劣于正常提交并 执行该查询时生成的计划。这是因为在对查询做 规划时(且优化器试图确定最优查询计划时),查询中 指定的任何参数的实际值都 不可用。PostgreSQL 收集 表中数据分布的统计信息,并可以利用 查询中的常量值来猜测执行查询的 可能结果。由于带参数的预备查询在规划时 这些数据不可用,所选的计划可能是 次优的。

关于查询规划以及 PostgreSQL 为查询 优化而收集的统计信息的更多信息,见 ANALYZE 文档。

兼容性

SQL92

SQL92 包括一条 PREPARE 语句,但它 只用于嵌入式 SQL 客户端。 PostgreSQL 实现的 PREPARE 语句使用的语法也略 有不同。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。