【问题标题】:Parameter sniffing / bind peeking in PostgresSQLPostgresQL 中的参数嗅探/绑定窥视
【发布时间】:2024-01-20 17:49:01
【问题描述】:

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

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

谢谢, 坎贝尔

【问题讨论】:

标签: postgresql sql-parametrized-query sqlbindparameter parameter-sniffing


【解决方案1】:

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

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

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

【讨论】:

    最近更新 更多