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