Consulta correta para obter o número atual de conexões em um banco de dados PostgreSQL

142

Qual dos dois seguintes é mais preciso?

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;
Murali VP
fonte
4
Melhor em termos de quê?
Jason Towne

Respostas:

226

Esses dois requisitos não são equivalentes. A versão equivalente do primeiro seria:

SELECT sum(numbackends) FROM pg_stat_database;

Nesse caso, eu esperaria que essa versão fosse um pouco mais rápida que a segunda, simplesmente porque tem menos linhas para contar. Mas você provavelmente não será capaz de medir a diferença.

Ambas as consultas são baseadas exatamente nos mesmos dados, para que sejam igualmente precisas.

Magnus Hagander
fonte
1
Não é verdade que eles são igualmente precisos. Veja minha resposta.
gargii
2
Observe que, quando a ferramenta de linha de comando do postgres, PSQL, é usada para executar esta consulta, o número total de conexões é o resultado dessa consulta - 1 desde que a conexão psql feita também seja incluída como uma conexão
neonidian
25

A consulta a seguir é muito ú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
fonte
2
você pode explicar quais são as colunas 'used' e 'res_for_super'?
apostou
Olá, usado são usados conexão, res_for_super é conexões reservada para acesso de superusuário
tbo
12

Definitivamente, eles podem dar resultados diferentes. O melhor é

select count(*) from pg_stat_activity;

É porque inclui conexões com os processos de remetente do WAL que são tratados como conexões regulares e contam para isso max_connections.

Veja max_wal_senders

gargii
fonte
2

Agregação de todas as sessões do postgres por status (quantas estão ociosas, quantas estão fazendo alguma coisa ...)

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

O número de conexões TCP o ajudará. Lembre-se de que não é para um banco de dados específico

netstat -a -n | find /c "127.0.0.1:13306"
Sureshkumar Pachamuthu
fonte
1
Este comentário é para um sistema operacional baseado no Windows. Para Linux, pode ser algo do seguinte: lsof -Pni: 5432 | fgrep ">" | fgrep -i estabelecido | wc -l
XXL
3
Esta não é uma consulta SQL, não adicione ruído a perguntas específicas.
precisa
-3

Observando o código-fonte, parece que a consulta pg_stat_database fornece o número de conexões com o banco de dados atual para todos os usuários. Por outro lado, a consulta pg_stat_activity fornece o número de conexões com o banco de dados atual apenas para o usuário consultante.

Brian L
fonte
1
Isso está incorreto. pg_stat_activity também fornece todas as conexões, independentemente do usuário. Em seguida, ele fornece um campo que diz qual usuário é, que você pode filtrar se quiser. Ele não fornecerá o texto da consulta se você não for o mesmo usuário ou um superusuário, mas ainda mostrará a conexão.
Magnus Hagander
3
Você está certo. Não olhei atentamente o suficiente para a definição da visualização. A restrição no userid é apenas para a junção contra pg_authid. Meu erro.
Brian L