Fórum Procedure com desempenho inferior no Postgres #26943

26/09/2008

0

Olá pessoal, estou trabalhando na migração de um banco de dados do Sybase para o Postgres. Já convertemos as DDLs e as consultas de todos os sistemas daqui, porém uma procedure ficou com o desempenho muito inferior ao que era. É um procedimento que foi elaborado há muito tempo e não tem documentação. O código não é muito legível, mas pode-se perceber que ela faz muitas operações. São três laços aninhados, sendo que o laço mais externo roda 32.000 vezes. Todavia, sua execução no Sybase dura 15min, mas no Postgres dura 1:40. Já modificamos as configurações do servidor e o nosso hardware é muito bom. Alguém teria idéia do que pode estar acontecendo? Utilizamos Pl/PgSQL.
A única diferença do algoritmo da proc que está no Sybase para a q nós convertemos é que no fim de cada laço há um commit. Infelizmente, isto não pode ser feito em Pl/PgSQL pois toda procedure escrita nesta linguagem é por default uma transação e o commit só é executado quando ela termina. Se alguém já passou por algo semelhante ou tiver alguma dica que possa me ajudar, serei grato.
Um abraço!


Fábio Lélis

Fábio Lélis

Responder

Posts

03/10/2008

Danilo Passos

Fábio,

Eu nunca tive um problema semelhante, mas consegui ter uma melhora em uma procedure muito grande mudando a forma como usava os parâmetros da função PL.

Por exemplo, se eu tenho o parâmetro v_teste de uma determinada função e uso ele no where e dentro de qualquer sub-select do mesmo select, a função ficava extremamente lenta. Já se uso o parâmetro apenas no where e uso o campo que usei na condição do where, a procedure fica mais rápida. Ao que parece, o compilador pl otimiza mais a execução da procedure quanto menos você utilizar variáveis no select em si. Não sei se isso ajuda, mas já é um bom início para pesquisa.

Se eu não me engano, você pode ainda fazer o código abaixo para obter uma noção de onde está o problema.

BEGIN;
EXPLAIN ANALYZE comando;
ROLLBACK;



Responder

Gostei + 0

03/10/2008

Fábio Lélis

Danilo, obrigado pela ajuda, mas já arrumei outra alternativa para resolver. Por curiosidade fiz um programa em Java com o mesmo algoritmo da procedure e ele executou em 2:18min. É um tempo aceitável visto o que era... Vamos deixar o código na aplicação.
Um abraço!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar