9

pg_prepared_statementsテーブルからすべての行を選択することにより、現在のセッションのすべての準備済みステートメントを一覧表示する方法があることは知っていますが、アクティブなすべてのセッションのすべての準備済みステートメントを表示する方法はありますか? 管理者機能のようなものを探していると思いますが、ドキュメントでそのようなものを見つけることができません。

4

1 に答える 1

7

いいえ。私の知る限り、準備されたステートメントはバックエンドに対してローカルです。他のバックエンドは、それらが存在することを知りません。サーバーを変更してプロセス間通信を追加し、1 つのバックエンドが他のバックエンドに準備済みステートメントについて質問できるようにする必要があります。

バックエンドは当初、次のように同じpg_prepared_statementsテーブル ストレージを共有しているように見えました。

SELECT relfilenode FROM pg_class WHERE  relname = 'pg_prepared_statements';

異なるバックエンドから同じ relfilenode を返します。準備されたステートメントはディスク上に存在しないと思っていたので、私は驚きました。それらがディスク上にある場合、pageinspect contrib モジュールの関数を使用して生のタプルまたはテーブル ページを読み取ることができると思います。可視性が問題になります。デッド/終了したバックエンドに何が関連していて、何が有効であったかをどのように知ることができますか?

私はそれを試してみました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()関数のビュー。ですから、検査することは何もありません。バックエンド内部です。

これは、「...でも、なぜそんなことをするの?」の 1 つに思えます。多くの場合、これは、誰かが実際の問題について尋ねるのではなく、実際の問題に対して思い描いた解決策について尋ねていることを示しています。

だから:なぜそれが欲しいのですか?あなたが解決しようとしている本当の問題は何ですか?

于 2012-08-28T13:19:39.353 に答える