Interrogazione corretta per ottenere il numero corrente di connessioni in un DB PostgreSQL


Risposte:


226

Questi due requisiti non sono equivalenti. La versione equivalente della prima sarebbe:

SELECT sum(numbackends) FROM pg_stat_database;

In tal caso, mi aspetto che quella versione sia leggermente più veloce della seconda, semplicemente perché ha meno righe da contare. Ma probabilmente non sarai in grado di misurare una differenza.

Entrambe le query si basano esattamente sugli stessi dati, quindi saranno ugualmente accurate.


1
Non è vero sono ugualmente precisi. Vedi la mia risposta
gargii,

2
Si noti che quando lo strumento da riga di comando postgres, PSQL viene utilizzato per eseguire questa query, il numero totale di connessioni è il risultato di questa query - 1 poiché la connessione psql effettuata è inclusa anche come connessione
neonidian

25

La seguente query è molto utile

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
puoi spiegare quali sono le colonne "usato" e "res_for_super"?
scommetti il

Ciao, sono usate connessioni utilizzate, res_for_super sono connessioni riservate per l'accesso da superutente
entro il

12

Possono sicuramente dare risultati diversi. Il migliore è

select count(*) from pg_stat_activity;

È perché include connessioni ai processi del mittente WAL che vengono trattate come connessioni regolari e ai quali contano max_connections.

Vedi max_wal_senders


2

Aggregazione di tutte le sessioni di postgres in base al loro stato (quante sono inattive, quante fanno qualcosa ...)

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

0

Il numero di connessioni TCP ti aiuterà. Ricorda che non è per un determinato database

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

1
Questo commento è per un sistema operativo basato su Windows. Per Linux potrebbe essere qualcosa del tipo: lsof -Pni: 5432 | fgrep ">" | fgrep -i stabilito | wc -l
XXL

3
Questa non è una query SQL, per favore non aggiungere rumore a domande specifiche.
bugmenot123

-3

Osservando il codice sorgente, sembra che la query pg_stat_database ti dia il numero di connessioni al database corrente per tutti gli utenti. D'altra parte, la query pg_stat_activity fornisce il numero di connessioni al database corrente solo per l'utente che esegue la query.


1
Non è corretto pg_stat_activity fornisce anche tutte le connessioni, indipendentemente dall'utente. Ti dà quindi un campo che dice quale utente è, su cui puoi filtrare se lo desideri. Non ti darà il testo della query se non sei lo stesso utente o un superutente, ma mostrerà comunque la connessione.
Magnus Hagander l'

3
Hai ragione. Non ho analizzato abbastanza da vicino la definizione della vista. La restrizione su userid è solo per il join contro pg_authid. Errore mio.
Brian L
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.