Hello all,
> Fabricio Veiga wrote:
> > Boa tarde senhores!
> >
> > Tenho um servidor Linux, mas precisamente um Suse, com versão do
> > PostgreSQL 8.3.1. <http://8.3.1.>
> > Eu tenho na base de dados, uma tabela com + / - 420 mil registros. Ao
> > executar a consulta (select * from tabela),
> > o tempo de execução é em torno de 7 segundos. O servidor é um Celeron
> > 2.66 com 1 Gbytes de RAM.
> > Estou ciente das configurações do servidor, porém as fazer o mesmo teste
> > em um banco de dados Interbase 6.5,
> > em outra máquina com as mesmas configurações, o tempo da consulta foi em
> > torno de 211 milisegundos.
> > Realizei a instalação padrao do PostgreSQL, sem mudanças no arquivo de
> > configurações.
> > Que parametros seriam necessário modificar para obter um desempenho
> > melhor nessa consulta ?
>
>       Acredito que você não vai obter desempenho melhor. O que acontece é que
> alguns SGDB's, e neste caso particular o Firebird, já começam a retornar
> os registros para a aplicação cliente 'a medida que são encontrados. O
> PostGreSql trabalha de forma diferente, os dados são retornados apenas
> após a consulta ser totalmente realizada. Ou seja, primeiro o PostGreSql
> encontra os 420 mil registros para depois retorná-los de uma vez,
> enquanto o Firebird vai enviando de partes em partes os registros
> encontrados. Salvo engano, o Sql Server permite configurar isto também,
> podendo trabalhar de uma forma ou de outra, mas desconheço forma de
> fazer o PostGreSql operar assim, talvez algum colega da lista já o saiba
> que queira compartilhar, alguém??
>
>       Ou seja, o PostGreSql não está preparado para usuários que não sabem o
> que querem e enviam consultas do tipo "select * from tabela" com
> relações deste tamanho.
>
>       É claro que existe o lado negro das história. Em especial full text
> search em tabelas muito grandes. Se eu fizer um limit 10 por exemplo
> para pegar os primeiros 10 registros de uma seleção, ele vai primeiro,
> selecionar todos os registros que satisfaçam à minha instrução SQL para
> somente depois limitar os 10 registros pedidos, enquanto o esperado
> seria que, assim que ele encontrasse o décimo registro ele já me
> retornar o resultado, por isso é importante sempre registringir o máximo
> os registros que quer buscar em sua SQL.
>
>       É uma limitação do PostGreSql (dentro dos meus conhecimentos),
> facilmente compensada com suas inúmeras outras facilidades.
Existe a opção de seria usar DECLARE [1] /FETCH [2] para retornar os 
resultados em conjuntos menores. Há algumas APIs que fazem isso 
automaticamente, dependendo é claro da linguagem de acesso utilizada.

Cursores declare/fetch são bastante flexíveis e podem inclusive ser acessados 
randomicamente (não é mandatório o acesso sequencial).

Por outro lado, carregar 420mil registros de uma vez quase nunca é uma boa 
idéia. Não seria o caso de utilizar LIMIT e OFFSET [3] para retornar apenas 
uma parte destes registros ?

[1] http://www.postgresql.org/docs/8.3/static/sql-declare.html
[2] http://www.postgresql.org/docs/8.3/static/sql-fetch.html
[3] http://www.postgresql.org/docs/8.3/static/sql-select.html
-- 
Best Regards,
Steve Howe
http://www.vitavoom.com

_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a