询问:
select * from table where col in ( values (?), (?), (?) )
生成查询文本,(?)的数量可变,最多 10000 个。
它工作得很好,只是想知道,Postgres 是否为不同数量的参数缓存相同的计划实例?
换句话说:Postgres 中计划缓存的关键是什么?它如何应用于上面的查询?
询问:
select * from table where col in ( values (?), (?), (?) )
生成查询文本,(?)的数量可变,最多 10000 个。
它工作得很好,只是想知道,Postgres 是否为不同数量的参数缓存相同的计划实例?
换句话说:Postgres 中计划缓存的关键是什么?它如何应用于上面的查询?
您更改查询中的参数数量吗?现在您
query
从查询规划器的角度得到了不同的结果。因此,在这种情况下,不会重用执行计划(除非您使用相同数量的参数),因为当您更改“IN”内的变量数量时,可能会有 10000 个执行计划。作为旁注,引用的标识符“mytable”和“MYTABLE”区分大小写,因此它们是不同的对象并产生不同的执行计划。它是与查询关联的准备好的语句(如果有的话),并且它不会自动发生。除了准备好的语句之外,没有计划缓存。
从文档中:
准备好的语句还可以通过使用解析/绑定/执行流在协议级别使用,在这种情况下,您的代码是否使用它们取决于客户端驱动程序和设置。
即使使用准备好的语句,计划的重用也取决于
plan_cache_mode
. 这是因为重复使用具有不同参数值的相同计划并不一定好。select * from table where id in ($1,$2)
像和 一样的查询select * from table where id in ($1,$2,$3)
不能用同一个准备好的语句来表示,因此必须单独规划它们。但
select * from table where id=ANY($1)
可以在同一准备语句中将不同数量的值重用为单个数组。您可以使用
EXPLAIN (ANALYZE, VERBOSE) EXECUTE name_of_prepared_statement(list-of-values)
并查看Planning Time
输出,看看当满足重用执行计划的条件时,速度有多快。