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!
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
Curtir tópico
+ 0
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.
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!
Um abraço!
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)