Em Segunda-feira, 10 de Fevereiro de 2014 12:48, Fabio Barros
<[email protected]> escreveu:
From: [email protected]
To: [email protected]
Date: Fri, 7 Feb 2014 14:57:06 +0000
Subject: [pgbr-geral] Diferenças de performance rodando funcao
Boa tarde pessoal!
Estou tentando entender a diferença de performance em duas implementações que
fazem a mesma coisa, mas ainda não consegui achar uma explicação.
Segue abaixo os dois exemplos, caso alguém possa me ajudar no entendimento:
Tenho um arquivo texto de 12 mil linhas, parte do conteudo abaixo:
SELECT aux_ir_gao_generico ('I', 39700, '1621', '39700', 0);
SELECT aux_ir_gao_generico ('I', 39700, '1622', '39700', 0);
. . .
SELECT aux_ir_gao_generico ('I', 39700, '1623', '39700', 0);
SELECT aux_ir_gao_generico ('I', 39700, '1624', '39700', 0);
******* Fiz um programa C++ que simplesmente lê o arquivo e executa cada uma de
suas linhas, a seguir:
main(){
time_t now;
char l_comando_sql[C_TAM_MAX_LINHA+1];
int resultado_st;
FILE* a_arq_executado;
PGconn *l_conexao = PQconnectdb(dbname=bd_vas user=vas_user);
PGresult *l_result;
now = time(0);
std::cout << "tempo inicial=" << now << std::endl;
a_arq_executado = fopen (C_NOME_ARQ_EXECUTADO, "r");
fseek (a_arq_executado, 0, SEEK_SET);
for(int cont_linha = 1; (fgets(l_comando_sql, sizeof(l_comando_sql),
a_arq_executado) != NULL); cont_linha++){
l_result = PQexec(l_conexao, l_comando_sql); -- comentando esta linha, fica
instantaneo (nao é problema ao ler o arquivo)
}
now = time(0);
std::cout << "tempo final=" << now << std::endl;
}
******* No outro teste, fiz uma funcao postgres e 'embuti' as mesmas queries, a
seguir:
CREATE FUNCTION insere_gao_mult () RETURNS INTEGER AS'
DECLARE
l_retorno INT;
BEGIN
SELECT into l_retorno aux_ir_gao_generico (''I'', 39700, ''1621'', ''39700'',
0);
SELECT into l_retorno aux_ir_gao_generico (''I'', 39700, ''1622'', ''39700'',
0);
-- omitindo as outras linhas, só 12 mil dentro de uma funcao... rs
SELECT into l_retorno aux_ir_gao_generico (''I'', 39700, ''1623'', ''39700'',
0);
SELECT into l_retorno aux_ir_gao_generico (''I'', 39700, ''1624'', ''39700'',
0);
RETURN 0;
END;
' LANGUAGE 'plpgsql';
Rodei um script .sh para chamar a funcao acima.
Tempo do programa C++..................................: 1 minuto
Tempo executando a funcao q contem as linhas do arquivo: 3 segundos
Particularmente, acho muito interessante este tipo de dúvida, e por isso
resolvi postar aqui....
Pq toda essa diferença no tempo?!?!?! (desculpem a ignorância)
obs: não vou ter funções como a do meu exemplo, é apenas para tentar entender
alguns conceitos.
Grato,
Fabio Barros
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Boa tarde!!!
Pessoal, estou lendo sobre as dúvidas destes dias, e acredito que meu e-mail
acima acabou 'passando'.
Vcs teriam algo a comentar sobre minha dúvida?
Obrigado e desculpem por pedir novamente, mas já acrescentando outra pergunta:
faz sentido, em função dessa diferença de tempo, adotar algo do tipo como
solução?!?!
obs: onde trabalho tb não há DBA Postgresql, e talvez eu seja quem mais conhece
sobre o banco aqui (porém pouco), mas minha 'facilidade' é mais em modelagem,
montagem de queries e funções.... e muito menos em administração, mas as
pessoas confundem.
Grato,
Fabio Barros
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
=================================================
Fábio, desculpe a demora na resposta.
A implementação em C é rápida, mas cada comando de banco de dados em sql
submetido passa por análise léxica e sintática, geração e otimização de plano
de execução para ser executado.
Na implementação com funções os comandos são armazenados em um formato não tão
eficaz quanto o códico compilado em C, mas já passaram pela análise e
otimização para o banco de dados, tendendo a serem bem rápidos.
Já que estás lendo os comandos de modo texto, sugiro que teste com o comando
COPY e traga o resultado para a lista:
http://www.postgresql.org/docs/9.3/static/sql-copy.html
Cordialmente,
Cláudio Leopoldino
postgresqlbr.blogspot.com/
=================================================_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral