PostgreSQL DBの現在の接続数を取得する正しいクエリ


回答:


226

これら2つの要件は同等ではありません。最初のものと同等のバージョンは次のようになります。

SELECT sum(numbackends) FROM pg_stat_database;

その場合、カウントする行が少ないというだけの理由で、そのバージョンは2番目のバージョンよりもわずかに高速になると予想します。しかし、違いを測定することはできないでしょう。

どちらのクエリもまったく同じデータに基づいているため、精度は同等です。


1
真実ではありませんが、それらも同様に正確です。私の答えを見てください。
gargii

2
postgresコマンドラインツールであるPSQLがこのクエリの実行に使用されている場合、接続の総数はこのクエリの結果であることに注意してください。作成されたpsql接続も接続として含まれているためです
ネオニディアン

25

次のクエリは非常に役立ちます

select  * from
(select count(*) used from pg_stat_activity) q1,
(select setting::int res_for_super from pg_settings where name=$$superuser_reserved_connections$$) q2,
(select setting::int max_conn from pg_settings where name=$$max_connections$$) q3;

2
「使用済み」および「res_for_super」列が何であるかを説明できますか?
賭ける

こんにちは、res_for_superは、接続はスーパーユーザのアクセス用に予約されて、接続を使用している使用
TBOを

12

彼らは確かに異なる結果を与える可能性があります。良い方は

select count(*) from pg_stat_activity;

これは、通常の接続として扱われ、にカウントされるWAL送信者プロセスへの接続が含まれているためmax_connectionsです。

max_wal_sendersを参照してください


2

ステータスごとのすべてのpostgresセッションの集計(アイドル状態の数、何かをしている数...)

select state, count(*) from pg_stat_activity  where pid <> pg_backend_pid() group by 1 order by 1;

0

TCP接続の数が役立ちます。特定のデータベース用ではないことに注意してください

netstat -a -n | find /c "127.0.0.1:13306"

1
このコメントは、WindowsベースのOSに対するものです。Linuxの場合、次のようになります。lsof-Pni:5432 | fgrep ">" | fgrep -i established | wc -l
XXL

3
これはSQLクエリではありません。特定の質問にノイズを加えないでください。
bugmenot123

-3

ソースコードを見ると、pg_stat_databaseクエリは、すべてのユーザーの現在のデータベースへの接続数を提供しているようです。一方、pg_stat_activityクエリは、現在のデータベースへの接続数を、クエリを実行しているユーザーのみに提供します。


1
不正解です。pg_stat_activityは、ユーザーに関係なく、すべての接続も提供します。次に、どのユーザーであるかを示すフィールドが表示され、必要に応じてフィルターをかけることができます。同じユーザーでもスーパーユーザーでもない場合、クエリテキストは表示されませんが、接続は表示されます。
Magnus Hagander

3
あなたが正しい。ビューの定義を十分に確認していませんでした。useridの制限は、pg_authidに対する結合だけです。私の間違い。
Brian L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.