Eu quero comparar uma consulta contendo uma função definida pelo usuário que escrevi para o PostgreSQL. Existem maneiras padrão de executar esse benchmark?
Eu sei que o tempo pode ser ativado no \timing
prompt do psql, mas idealmente eu gostaria de ter um script que cuidasse de tudo automaticamente: executando a consulta algumas vezes, limpando o cache do PostgreSQL após cada execução (provavelmente reiniciando o service) e gerando o tempo médio de execução (e a memória usada é uma vantagem).
A ferramenta mais utilizada é o comando SQL
EXPLAIN ANALYZE
, possivelmente com mais opções para maiores detalhes na resposta. Isso gera o plano de consulta com as estimativas do planejador mais os tempos de execução reais.Por que você quer limpar o cache? O caso de uso geralmente mais provável é que o cache seja preenchido. Se você ainda quiser seguir esse caminho, aqui está uma resposta relacionada no SO .
Sem redefinir o cache, aqui estão duas maneiras simples de testar com muitas iterações:
UDF simples
Ou com entrada aleatória - números aleatórios entre 0 e 5000 no exemplo:
Ou com uma mesa da vida real:
Funções/consultas mais complexas
Ligar:
Cuidado : A consulta é realmente executada!
Cuidado : Não apto para uso público. Possível injeção de SQL.
Novamente, você pode usar parâmetros aleatórios, se necessário. Possivelmente com a
USING
cláusula deEXECUTE
.Mais opções
\timing
log_duration
clock_timestamp()
Para detalhes, consulte: