Erwin 指出了这一点,但让我补充一点,扩展查询协议允许您使用更多风格的预准备语句。除了避免重新解析和重新规划之外,prepared statements 的一大优点是单独发送参数值,这避免了转义和解析开销,更不用说如果你不使用处理的 API 的 SQL 注入和错误的机会参数以一种你不能忘记逃避它们的方式。
http://www.postgresql.org/docs/9.1/static/protocol-flow.html
处理 Parse 消息时会发生命名准备语句对象的查询计划。如果查询将使用不同的参数重复执行,则发送包含参数化查询的单个 Parse 消息,然后发送多个 Bind 和 Execute 消息可能会有所帮助。这将避免在每次执行时重新计划查询。
如果 Parse 消息未定义任何参数,则在 Parse 处理期间同样计划未命名的准备好的语句。但如果有参数,则每次提供 Bind 参数时都会进行查询计划。这允许规划器使用每个 Bind 消息提供的参数的实际值,而不是使用通用估计值。
因此,如果您的数据库接口支持它,您可以使用未命名的预准备语句。这是查询和通常的准备语句之间的中间立场。
如果你在 PDO 中使用 PHP,请注意 PDO 的prepared statement 实现对于 postgres 来说是相当无用的,因为它使用命名的prepared statements,但每次调用 prepare() 时都会重新准备,不会发生计划缓存。所以你得到了两者中最糟糕的:许多往返和没有参数的计划。我已经看到它比 pg_query() 和 pg_query_params() 在 postgres 优化器确实需要知道参数以生成最佳计划的特定查询上慢 1000 倍。pg_query 使用原始查询,pg_query_params 使用未命名的预处理语句。通常一个比另一个快,这取决于参数数据的大小。