如何列出所有活动会话的所有准备好的语句?

Posted

技术标签:

【中文标题】如何列出所有活动会话的所有准备好的语句?【英文标题】:How to list all prepared statements for all active sessions? 【发布时间】:2012-08-22 23:17:40 【问题描述】:

我知道有一种方法可以通过从pg_prepared_statements 表中选择所有行来列出当前会话的所有准备好的语句,但是有没有办法查看所有活动会话的所有准备好的语句?我想我正在寻找类似管理员功能的东西,但我在文档中找不到类似的东西。

【问题讨论】:

【参考方案1】:

不。 AFAIK 准备好的语句是后端本地的;其他后端只是不知道它们存在。您需要修改服务器以添加额外的进程间通信,以允许一个后端向其他后端询问准备好的语句。

后端最初似乎共享相同的pg_prepared_statements 表存储,如下所示:

SELECT relfilenode FROM pg_class WHERE  relname = 'pg_prepared_statements';

从不同的后端返回相同的 relfilenode。我很惊讶,因为我认为准备好的语句在磁盘上没有存在。如果它们在磁盘上,我猜您可以使用 pageinspect contrib module 中的函数来读取原始元组或表页。能见度是个问题;您如何知道与死/终止的后端相关的内容以及有效的内容?

我试了一下,发现pg_prepared_statements其实是一个视图:

regress=# SELECT * FROM heap_page_items(get_raw_page('pg_prepared_statements', 1));
ERROR:  cannot get raw page from view "pg_prepared_statements"

特别是pg_prepared_statement() 函数的视图。所以没有什么可以检查的。它是内部的后端。

这似乎是其中之一“......但你为什么要这样做?”问题,这通常表明有人在询问他们为实际问题设想的解决方案,而不是询问他们的实际问题。

那么:你为什么想要那个?您要解决的真正问题是什么?

【讨论】:

是的,你是对的,我试图缩小一个我太不确定以问题形式总结的问题。我认为这可能与缓存的准备好的语句返回的行有关,这些语句的值在最后一个 UPDATE 之前就已经存在。 @IgorZinov'yev 准备好的语句极不可能与您查看旧数据的查询相关。准备好的语句没有结果缓存或数据缓存,只有一个计划缓存。我可以想象的唯一方法是如果你DROPped 表继承结构中的一个分区并且准备好的语句的计划没有被刷新,但是 Pg 非常小心地跟踪准备好的语句以防止这种排序的东西。 @IgorZinov'yev 你可能需要研究事务隔离(你是在READ COMMITED 还是SERIALIZABLE 隔离?),事务划分(在你认为他们做的地方做你的 tx 的开始和结束)等。 你是对的,它与准备好的语句没有任何关系。它与不正确的元标记放置有关,导致浏览器页面重新加载,从而导致页面上使用了无效的缓存数据。我偶然发现了这个问题,说我很惊讶就是无话可说:)

以上是关于如何列出所有活动会话的所有准备好的语句?的主要内容,如果未能解决你的问题,请参考以下文章

单击注销时如何从所有活动会话中注销?

终止会话

如何在会话超时时关闭所有活动的引导模式?

jboss_cli 活动会话详细信息 [关闭]

多点连接:列出所有附近的会话

Meterpreter入门与精通