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

Responder a