如何列出所有活动会话的所有准备好的语句?
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 准备好的语句极不可能与您查看旧数据的查询相关。准备好的语句没有结果缓存或数据缓存,只有一个计划缓存。我可以想象的唯一方法是如果你DROP
ped 表继承结构中的一个分区并且准备好的语句的计划没有被刷新,但是 Pg 非常小心地跟踪准备好的语句以防止这种排序的东西。
@IgorZinov'yev 你可能需要研究事务隔离(你是在READ COMMITED
还是SERIALIZABLE
隔离?),事务划分(在你认为他们做的地方做你的 tx 的开始和结束)等。
你是对的,它与准备好的语句没有任何关系。它与不正确的元标记放置有关,导致浏览器页面重新加载,从而导致页面上使用了无效的缓存数据。我偶然发现了这个问题,说我很惊讶就是无话可说:)以上是关于如何列出所有活动会话的所有准备好的语句?的主要内容,如果未能解决你的问题,请参考以下文章