PostgresSQL 中的参数嗅探/绑定查看

Cam*_*ser 2 postgresql prepared-statement parameter-sniffing

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

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

jja*_*nes 5

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

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

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