Query yang tepat untuk mendapatkan jumlah koneksi saat ini dalam DB PostgreSQL

142

Manakah dari dua berikut ini yang lebih akurat?

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;
Murali VP
sumber
4
Lebih baik dalam hal apa?
Jason Towne

Jawaban:

226

Keduanya membutuhkan tidak setara. Versi yang setara dari yang pertama adalah:

SELECT sum(numbackends) FROM pg_stat_database;

Dalam hal ini, saya berharap versi itu sedikit lebih cepat daripada yang kedua, hanya karena memiliki lebih sedikit baris untuk dihitung. Tetapi Anda tidak akan mungkin bisa mengukur perbedaan.

Kedua pertanyaan didasarkan pada data yang persis sama, sehingga mereka akan sama akuratnya.

Magnus Hagander
sumber
1
Tidak benar mereka juga sama akuratnya. Lihat jawaban saya.
gargii
2
Perhatikan bahwa ketika alat baris perintah postgres, PSQL digunakan untuk mengeksekusi kueri ini, jumlah total koneksi adalah hasil dari kueri ini - 1 karena koneksi psql yang dibuat juga termasuk sebagai koneksi
neonidian
25

Permintaan berikut ini sangat membantu

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;
tbo
sumber
2
dapatkah Anda menjelaskan apa kolom 'bekas' dan 'res_for_super'?
Taruhan
Halo, koneksi bekas digunakan, res_for_super adalah koneksi yang disediakan untuk akses pengguna
super
12

Mereka pasti dapat memberikan hasil yang berbeda. Yang lebih baik adalah

select count(*) from pg_stat_activity;

Itu karena itu termasuk koneksi ke proses pengirim WAL yang diperlakukan sebagai koneksi biasa dan diperhitungkan max_connections.

Lihat max_wal_senders

gargii
sumber
2

Agregasi semua sesi postgres per statusnya (berapa banyak yang menganggur, berapa banyak yang melakukan sesuatu ...)

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

Jumlah koneksi TCP akan membantu Anda. Ingat bahwa ini bukan untuk database tertentu

netstat -a -n | find /c "127.0.0.1:13306"
Sureshkumar Pachamuthu
sumber
1
Komentar ini untuk OS berbasis Windows. Untuk Linux dapat berupa sesuatu sebagai berikut: lsof -Pni: 5432 | fgrep ">" | fgrep -i yang didirikan | wc -l
XXL
3
Ini bukan query SQL, tolong jangan tambahkan noise ke pertanyaan spesifik.
bugmenot123
-3

Dari melihat kode sumber, sepertinya permintaan pg_stat_database memberi Anda jumlah koneksi ke database saat ini untuk semua pengguna. Di sisi lain, permintaan pg_stat_activity memberikan jumlah koneksi ke database saat ini hanya untuk pengguna yang meminta.

Brian L
sumber
1
Itu tidak benar. pg_stat_activity memberikan semua koneksi juga, terlepas dari pengguna. Ini kemudian memberi Anda bidang yang mengatakan pengguna itu, yang dapat Anda filter jika Anda mau. Itu tidak akan memberi Anda teks kueri jika Anda bukan pengguna yang sama atau pengguna super, tetapi masih akan menunjukkan koneksi.
Magnus Hagander
3
Kamu benar. Saya tidak melihat cukup dekat pada definisi tampilan. Pembatasan pada userid hanya untuk bergabung dengan pg_authid. Kesalahanku.
Brian L