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