Consulta correcta para obtener el número actual de conexiones en una base de datos PostgreSQL

142

¿Cuál de los siguientes dos es más preciso?

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;
VP VP Murali
fuente
44
¿Mejor en términos de qué?
Jason Towne

Respuestas:

226

Esos dos requisitos no son equivalentes. La versión equivalente de la primera sería:

SELECT sum(numbackends) FROM pg_stat_database;

En ese caso, esperaría que esa versión sea un poco más rápida que la segunda, simplemente porque tiene menos filas para contar. Pero no es probable que pueda medir la diferencia.

Ambas consultas se basan exactamente en los mismos datos, por lo que serán igualmente precisas.

Magnus Hagander
fuente
1
No es cierto, son igualmente precisos. Mira mi respuesta.
gargii
2
Tenga en cuenta que cuando la herramienta de línea de comando postgres, PSQL se utiliza para ejecutar esta consulta, el número total de conexiones es el resultado de esta consulta - 1 ya que la conexión psql realizada también se incluye como una conexión
neonidian
25

La siguiente consulta es muy útil.

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
fuente
2
¿Puedes explicar cuáles son las columnas 'usado' y 'res_for_super'?
Apuesta
Hola, se usan conexiones usadas, res_for_super son conexiones reservadas para acceso de superusuario
tbo
12

Definitivamente pueden dar resultados diferentes. El mejor es

select count(*) from pg_stat_activity;

Es porque incluye conexiones a los procesos del remitente WAL que se tratan como conexiones regulares y cuentan para max_connections.

Ver max_wal_senders

gargii
fuente
2

Agregación de todas las sesiones de postgres por su estado (cuántas están inactivas, cuántas hacen algo ...)

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

El número de conexiones TCP te ayudará. Recuerde que no es para una base de datos particular

netstat -a -n | find /c "127.0.0.1:13306"
Sureshkumar Pachamuthu
fuente
1
Este comentario es para un sistema operativo basado en Windows. Para Linux podría ser algo de lo siguiente: lsof -Pni: 5432 | fgrep ">" | fgrep -i establecido | wc -l
XXL
3
Esta no es una consulta SQL, no agregue ruido a preguntas específicas.
bugmenot123 05 de
-3

Al mirar el código fuente, parece que la consulta pg_stat_database le brinda la cantidad de conexiones a la base de datos actual para todos los usuarios. Por otro lado, la consulta pg_stat_activity proporciona el número de conexiones a la base de datos actual solo para el usuario que realiza la consulta.

Brian L
fuente
1
Eso es incorrecto pg_stat_activity también proporciona todas las conexiones, independientemente del usuario. Luego le da un campo que dice qué usuario es, que puede filtrar si lo desea. No le dará el texto de la consulta si no es el mismo usuario o un superusuario, pero seguirá mostrando la conexión.
Magnus Hagander
3
Tienes razón. No miré lo suficientemente de cerca la definición de la vista. La restricción en userid es solo para la unión contra pg_authid. Mi error.
Brian L