RETURN QUERY vs RETURN QUERY EXECUTE

ilo*_*tie 8 postgresql

PostgreSQL 39.6.控制结构: RETURN QUERY有一个变量RETURN QUERY EXECUTE,它指定要动态执行的查询.可以通过USING将参数表达式插入到计算的查询字符串中,其方式与EXECUTE命令中的方式相同.

动态意味着什么?

这两个语句之间有什么区别(带func_param参数的内部函数):

RETURN QUERY SELECT * FROM foo WHERE foo_col = func_param;
Run Code Online (Sandbox Code Playgroud)

RETURN QUERY EXECUTE 'SELECT * FROM foo WHERE foo_col = $1' USING func_param;
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 10

这两个示例之间的区别在于,在第一个示例中,可以保留查询计划并将其重用于将来在同一数据库会话中执行.

在第二个示例中,每次执行函数时都会计划查询.

第一个示例的优点是,如果重复执行该功能,则可以节省计划时间.从第六次执行开始,PostgreSQL可能会选择使用通用计划(请参阅文档),该计划将用于同一数据库会话中的所有未来执行.

第二个例子只有在选择的通用计划证明不好的情况下才有用,而且你宁愿让PostgreSQL每次都重新计算查询.

  • 当 SQL 动态构建时,第二个选项很有用。当规划器选择不同的计划时,当查询参数被常量替换时,在诸如“WHERE param IS NULL OR field = param”的情况下,规划器可以完全删除过滤器的左侧或右侧部分,应该将参数替换为常量,这也很有用。 (2认同)