2

PostgreSQL 中的PrepareExecute组合允许使用绑定参数。但是,Prepare 不会生成针对一组参数绑定优化的计划,该计划可以与一组不同的参数绑定一起重复使用。是否有人对实现此类功能有意见?有了这个,计划将针对给定的参数绑定集进行优化,但可以重用于另一组。该计划对于后续集可能效率不高,但如果使用新参数绑定重新计算计划成本,则可能会发现它是有效的。

读取和使用参数绑定值进行基数估计在 SQL Server 中称为“参数嗅探”,在 Oracle 中称为“绑定窥视”。基本上,有没有人在 PostgreSQL 中做过类似的事情。

谢谢,坎贝尔

4

1 回答 1

5

PostgreSQL 使用启发式方法来决定是否进行“绑定偷看”。它确实会偷看执行准备好的语句的前 5 次(我认为是),如果这些都没有导致比通用计划更好(预期会更好)的计划,它会在未来停止检查.

从 v12 开始,您可以通过设置 plan_cache_mode 来更改此启发式。

请注意,一些驱动程序实现了它们自己的启发式方法——仅仅因为您调用驱动程序的准备方法并不意味着它实际上将其作为 PREPARE 传输到服务器。相反,它可能会将语句文本隐藏起来,等到您执行,然后引用/转义您的参数并将它们与您之前的伪准备语句捆绑在一起,并在一个数据包中将它们发送到服务器。也就是说,他们可能将准备/执行分离仅仅视为一种防止 SQL 注入的方法,而不是一种提高性能的方法。

于 2020-07-20T17:56:38.747 回答