Em ambientes corporativos, especialmente quando bancos de dados são compartilhados entre múltiplos usuários ou sistemas, é essencial que o controle sobre a execução de comandos SQL seja mantido. Caso contrário, o desempenho do banco de dados como um todo pode ser facilmente comprometido por comandos mal construídos ou por consultas acidentalmente pesadas. Para prevenir esse tipo de situação, o PostgreSQL oferece uma configuração específica chamada statement_timeout.
O que é o statement_timeout
O parâmetro statement_timeout define o tempo máximo (em milissegundos) que uma instrução SQL pode levar para ser executada. Se o tempo limite for atingido, o PostgreSQL cancela automaticamente a execução do comando e retorna um erro.
Isso é especialmente útil para evitar que consultas muito pesadas, mal otimizadas ou acidentais fiquem consumindo recursos do banco indefinidamente. Dentre as principais vantagens em sua implementação:
- Evita travamentos e lentidão no banco causados por comandos muito demorados;
- Garante previsibilidade e performance, especialmente em ambientes compartilhados;
- Permite controle fino por usuário ou grupo, o que é excelente para separar ambientes de produção, testes ou perfis de acesso distintos;
- Complementa boas práticas de desenvolvimento e governança de banco de dados, sendo uma medida preventiva de segurança operacional.
Aplicando o limite globalmente
Para aplicar a configuração que limita qualquer comando SQL a, no máximo, 2 horas (7.200.000 milissegundos) em todo o ambiente, existem duas abordagens possíveis. Primeiramente, a configuração pode ser feita diretamente no arquivo postgresql.conf, adicionando a linha statement_timeout = 7200000 e, em seguida, reiniciando o servidor. Alternativamente, também é possível conectar-se ao banco de dados e executar o seguinte comando:
ALTER SYSTEM SET statement_timeout = 7200000;
SELECT pg_reload_conf();
Aplicando o limite para um grupo de usuários
Caso você queira limitar apenas para um grupo de usuários (por exemplo um grupo chamado analistas), execute o seguinte comando no PostgreSQL:
ALTER ROLE analistas SET statement_timeout = 7200000;
Esse comando define o tempo limite para qualquer nova sessão iniciada por usuários que pertencem ao role analistas. Ou seja, a partir do próximo login, todos os comandos executados por esses usuários serão interrompidos automaticamente caso ultrapassem 2 horas de execução.
Após aplicar a configuração, você pode confirmar se o parâmetro foi corretamente atribuído ao role com a seguinte consulta:
SELECT rolname, rolconfig FROM pg_roles WHERE rolname = 'analistas';
A coluna rolconfig deve exibir algo semelhante a {statement_timeout=7200000} , confirmando que a configuração está ativa para o role informado.
Considerações finais
A definição de limites de execução para comandos SQL é recomendada como prática em ambientes corporativos. A utilização do statement_timeout por role no PostgreSQL é considerada uma forma eficiente e elegante de garantir que o banco de dados seja protegido contra sobrecargas provocadas por instruções excessivamente longas.
Caso esse tipo de controle ainda não tenha sido implementado, ele deve ser considerado desde já — especialmente quando se trata de roles com acessos mais amplos, como os atribuídos a analistas ou desenvolvedores..
Fontes/Referências
https://postgresql.org/docs/current/runtime-config-client.html
https://stackoverflow.com/questions/24092463/psql-set-default-statement-timeout-as-a-user-in-postgres
Mais Informações
Esperamos ter te ajudado e estaremos sempre a disposição para mais informações.
Se você tem interesse em algum assunto específico, tem alguma dúvida, precisa de ajuda, ou quer sugerir um post, entre em contato conosco pelo e-mail equipe@nvlan.com.br.
