如何使用内联参数值在PLPGSQL内部记录查询

纽力克

当我的PLPGSQL函数(Postgres 9.6)中的一条语句正在运行时,我可以在一行上看到查询,然后在另一行上看到所有参数。2行记录。就像是:

LOG:  execute <unnamed>: SELECT * FROM table WHERE field1=$1 AND field2=$2 ...    
DETAIL:  parameters: $1 = '-767197682', $2 = '234324' ....

是否有可能登陆pg_log整个查询WITH参数已经在查询替换,并在其记录行?

因为这将使复制/粘贴查询以在另一个终端中重现它变得更加容易,尤其是在查询具有数十个参数的情况下。

欧文·布兰德斯特(Erwin Brandstetter)

其背后的原因:PL / pgSQL在内部将SQL语句视为已准备好的语句

第一:使用默认设置时,在PL / pgSQL函数中根本不记录SQL语句。您正在使用auto_explain吗?

在同一会话中的前两次调用中,SPI管理器(服务器编程接口)根据实际参数值生成新的执行计划任何类型的日志记录都应内联报告参数值

Postgres会跟踪当前会话中的几次调用,如果执行计划对实际参数值似乎不敏感,它将开始重新使用通用的缓存计划。然后,您应该看到带有$n参数的预准备语句的通用计划(如问题中所示)。

手册中“计划缓存”一章中的详细信息

您可以通过一个简单的演示来观察效果。在同一会话中(不一定是同一笔交易):

CREATE TEMP TABLE tbl AS
SELECT id FROM generate_series(1, 100) id;

PREPARE prep1(int) AS
SELECT min(id) FROM tbl WHERE id > $1;

EXPLAIN EXECUTE prep1(3);  -- 1st execution

您将看到实际值:

  Filter: (id > 3)
EXECUTE prep1(1);  -- several more executions
EXECUTE prep1(2);
EXECUTE prep1(3);
EXECUTE prep1(4);
EXECUTE prep1(5);

EXPLAIN EXECUTE prep1(3);

现在,您将看到一个$n参数:

  Filter: (id > $1)

因此,您可以在当前会话的前两次调用中获得内联参数值的查询

或者,您可以将动态SQL与一起使用EXECUTE,因为根据文档:

另外,没有计划缓存通过来执行的命令EXECUTE而是总是在每次运行语句时计划命令。因此,可以在函数中动态创建命令字符串,以对不同的表和列执行操作。

当然,这实际上会影响性能。

有关的:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用参数值在postgresql函数内部动态构建的SQL查询?

来自分类Dev

Ningx:如何使用特定的查询参数值过滤请求?

来自分类Dev

Dapper.net:如何使用参数值打印查询

来自分类Dev

如何使用Django检索多个查询参数值?

来自分类Dev

如何更改tRestClient的查询参数值

来自分类Dev

如何使用pg_stat_statements记录查询参数?

来自分类Dev

使用Javassist记录方法调用和参数值,如何使记录器类在每个检测类中可见?

来自分类Dev

如何在plpgsql中使用记录类型变量?

来自分类Dev

Jooby查询参数值

来自分类Dev

如何在python的嵌入式sql查询中使用参数值?

来自分类Dev

如何使用JSP从URL获取参数值

来自分类Dev

如何使用参数值过滤消息

来自分类Dev

如何使用eval命令以打印参数值

来自分类Dev

如何使用参数值打印调用堆栈?

来自分类Dev

使用API蓝图记录查询参数

来自分类Dev

如何从URL查询字符串获取参数值

来自分类Dev

如何在ember的url中显示默认查询参数值?

来自分类Dev

如何动态地向JdbcTemplate查询添加参数值?

来自分类Dev

Couchbase参数化查询与数值

来自分类Dev

内联参数化查询超时

来自分类Dev

如何执行将列名作为参数传递给plpgsql函数的查询?

来自分类Dev

如何使用log.d记录整数值?

来自分类Dev

如何基于计数值并使用SQL分别插入记录?

来自分类Dev

如何基于计数值并使用SQL分别插入记录?

来自分类Dev

如何在过程内部查询中使用过程参数变量

来自分类Dev

如何计算记录及其数值

来自分类Dev

如何内联我的内部函数?

来自分类Dev

如何内联我的内部函数?

来自分类Dev

内部函数的char *参数值更改

Related 相关文章

热门标签

归档