Caro Rafael:

  Obrigado pela resposta.

  A "select fib(35);" retorna 9227465, e select fnc_fibonacci(35) retorna 
14930352. Não sei qual está certa ou errada.

  Estou utilizando a 8.2.7 por a mesma já estar instalada aquí e no cliente. A 
versão 8.4 tem "WITH RECURSIVE", mas tal não seria compatível com o mesmo 
código escrito no Oracle.

  A minha intenção ao usar o fibonacci foi para mensurar performance. Eu não 
sabia que o Postgres não trata a recursividade corretamente, portanto, vou 
desconsiderá-la.
  De qualquer forma, também utilizei um outro exemplo com um simples LOOP 
(function1), e a diferença também foi absurda.
  Baseado nestes, entendí que o PL/pgSQL é muito inferior em termos de 
performance do que o PL/SQL no Oracle. Por favor, me desculpe se escreví alguma 
bobagem, ou não fui claro o suficiente. Ficarei muito agradecido se você ou os 
demais membros postarem mais dicas de performance ou outros exemplos que eu 
possa utilizar. Entenda também que a diferença de performance foi tão grande à 
ponto de eu desconfiar de um problema no servidor Linux.


Atenciosamente,

Márcio de Figueiredo Moura e Castro
  





________________________________
De: Rafael Domiciano <rafael.domici...@gmail.com>
Para: Comunidade PostgreSQL Brasileira <pgbr-geral@listas.postgresql.org.br>
Enviadas: Segunda-feira, 21 de Setembro de 2009 13:26:07
Assunto: Re: [pgbr-geral] Res: Res: Performance usando funções em PLPGSQL 
comparadas ao PL/SQL no Oracle

Olá Marcio,

Acho que você não deveria deixar de portar um banco no primeiro obstáculo. 
Existem muitas diferenças entre eles, e acredito que com o tempo você vai se 
adaptar ao Postgres. Concordo que trabalhar com Recursividade é complicado no 
Postgres, você poderia dar uma olhada nessa funcionalidade na última versão do 
Postgres, a 8.4.1.

Enquanto isso, eu refiz a função de Fibonacci. A fórmula peguei na wikpedia 
[1], conforme exemplo para Pascal.

CREATE OR REPLACE FUNCTION fnc_fibonacci (v_numero integer) RETURNS integer AS
$BODY$
DECLARE
  v_cont    integer;
  v_f1        integer;
  v_f2        integer;
  v_f3        integer;
BEGIN
  IF (v_numero < 2) THEN
    RETURN v_numero;
  END IF;
  
  v_cont := 1;
  v_f1   := 1;
  v_f2   := 0;

  WHILE (v_cont <= v_numero) LOOP
    v_f3 := v_f1 + v_f2;
    v_f2 := v_f1;
    v_f1 := v_f3;

    v_cont := v_cont + 1;
  END LOOP;
  
  RETURN v_f3;
END;
$BODY$
LANGUAGE 'plpgsql';

[1]: http://pt.wikipedia.org/wiki/N%C3%BAmero_de_Fibonacci


2009/9/21 MARCIO CASTRO <marciomouracas...@yahoo.com.br>

Caro André:
>
>  Muito obrigado pela dica. A fib(35) passou para 60s, e a function1 para 19s. 
> Mas mesmo assim, a performance ainda está muito aquém dos tempos do Oracle 
> (21,04s e 3,5s) em um mísero Celeron. 
>
>>  Termino agradecendo muito aos integrantes desta lista que prontamente me 
>> ajudaram. Acho que o PostgreSQL tem um próspero futuro, mas a performance do 
>> PLPGSQL inviabiliza a portabilidade do Oracle - PL/SQL. Ou, ao menos, para 
>> este projeto.
>
>
>
>Atenciosamente,
>
>Márcio de Figueiredo Moura e Castro
>
>
>
>
>
>
________________________________
De: André Volpato <andre.volp...@ecomtecnologia.com.br>
>
>Para: Comunidade PostgreSQL Brasileira <pgbr-geral@listas.postgresql.org.br>
>Enviadas: Segunda-feira, 21 de Setembro de 2009 10:38:31
>Assunto: Re: [pgbr-geral] Res:  Performance usando funções em PLPGSQL 
>comparadas ao PL/SQL no Oracle
>
>
>>
>
>  
>
>MARCIO CASTRO escreveu:
>
>>> 
>>(...)
>>
>>
>>
>
>Para
>>complementar o que eu estou falando, criei a função que calcula o
>>número do Fibonacci. No Oracle, levou 21,04 segundos, e no PostgreSQL,
>>82,53 segundos (select fib(35)).
>>
>>>>Pergunto novamente aos senhores então: a diferença é esta mesmo? Alguém
>>do grupo poderia compilar a função abaixo (Fibonacci) e me retornar o
>>tempo de execução?
>>
>>
>>Pra você ter um ganho de performance, altere a instrução "VOLATILE"
>para "IMMUTABLE".
>>Aqui (Xeon(R) E5420 @ 2.50GHz) , o menor tempo que consegui foram 45s.
>>Para esta query recursiva em PL, o limite vai ser o processador mesmo. 
>
>>Tente reescrever sem recursividade, só por curiosidade. Creio que este
>tipo de abordagem em PL fique lenta mesmo.
>
>
>Doctor
>>House in apology to Mike Jagger
>>
>Mick !
>>;)
>
>>[]´s, André Volpato
>
>
>>
> 
________________________________
Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 - 
Celebridades - Música - Esportes
>_______________________________________________
>>pgbr-geral mailing list
>pgbr-geral@listas.postgresql.org.br
>https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>



      
____________________________________________________________________________________
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a