Select que retorna mais de 50.000 registros
Pessoal...
Estou com um problema aqui em relação à visualização de datasets com muitos registros... Estou trabalhando com PostgreSQL + Zeos + Delphi 7... Utilizando uma grid simples, devidamente conectada ao banco, com a instrução:
Em uma base local, em que a tabela usu possui 200.000 registros, o retorno para visualição dos registros na grid é algo em torno de 2 segundos. O que eu considero ótimo...
Mas... O que eu realmente preciso, é que esta base fique online... Portanto, estou fazendo o mesmo processo em uma base remota, instalada em um servidor FreeBSD e conectando através de VPN. Neste caso, a tabela possui em torno de 140.000 registros e o retorno para visualização dos registros na grid é algo em torno de 1 minuto, o que considero impossível de se trabalhar...
Nos componentes ADO, mais precisamente no ADOQuery, existe uma propriedade CacheSize, que, se não me engano, é a quantidade de registros que o dataset vai trazer à memória local para visualização. Conforme se navega na grid, ele vai trazendo mais registros...
Gostaria de saber se realmente é isso o que o ADO faz, e se positivo, se existe alguma maneira de se fazer isso com o Zeos...
Estou com um problema aqui em relação à visualização de datasets com muitos registros... Estou trabalhando com PostgreSQL + Zeos + Delphi 7... Utilizando uma grid simples, devidamente conectada ao banco, com a instrução:
select * from usu order by codusu
Em uma base local, em que a tabela usu possui 200.000 registros, o retorno para visualição dos registros na grid é algo em torno de 2 segundos. O que eu considero ótimo...
Mas... O que eu realmente preciso, é que esta base fique online... Portanto, estou fazendo o mesmo processo em uma base remota, instalada em um servidor FreeBSD e conectando através de VPN. Neste caso, a tabela possui em torno de 140.000 registros e o retorno para visualização dos registros na grid é algo em torno de 1 minuto, o que considero impossível de se trabalhar...
Nos componentes ADO, mais precisamente no ADOQuery, existe uma propriedade CacheSize, que, se não me engano, é a quantidade de registros que o dataset vai trazer à memória local para visualização. Conforme se navega na grid, ele vai trazendo mais registros...
Gostaria de saber se realmente é isso o que o ADO faz, e se positivo, se existe alguma maneira de se fazer isso com o Zeos...
Ffsombra
Curtidas 0
Respostas
Xisto
29/05/2004
Para o bem da rede e dos bons costumes.
Existe mesmo a necessidade de abrir todos os MILS registros de uma só vez ?
Isto vai sobrecarregar a rede por melhor que ela seja.
Ou entao nao entendi bem o que vc precisa.
[]s
Xisto
Existe mesmo a necessidade de abrir todos os MILS registros de uma só vez ?
Isto vai sobrecarregar a rede por melhor que ela seja.
Ou entao nao entendi bem o que vc precisa.
[]s
Xisto
GOSTEI 0
Ffsombra
29/05/2004
Para o bem da rede e dos bons costumes.
Existe mesmo a necessidade de abrir todos os MILS registros de uma só vez ?
Isto vai sobrecarregar a rede por melhor que ela seja.
Ou entao nao entendi bem o que vc precisa.
[]s
Xisto
Infelizmente, eu preciso...
Mas eu gostaria que ao invés de trazer todos os 50.000 registros de uma só vez, ele fosse trazendo esses registros conforme eu fosse navegando na grid... acredito que assim não comprometeria a rede...
GOSTEI 0
Vinicius2k
29/05/2004
Fábio,
Ajuste a propriedade ´Filtered´ da ZQuery para True... isso não vai influenciar em nada o resultado do select, mas vai fazer com que a ZQuery se comporte como uma IBQuery, por exemplo, trazendo para o buffer os registros, à medida que forem solicitados...
Eu acho q isso é um ´quebra-galho´ q fizeram pq está no ´Know Bugs´, mas funciona perfeitamente...
Feito isso, sua performace crescerá muito, mas vc se vc disparar um ´ZQuery.Last´ ou um ´ZQuery.RecordCount´ ae já era... vai levar os 60 segundos pq ele vai precisar trazer tudo para o buffer para mover o cursor para o final...
Espero ter ajudado...
T+
Ajuste a propriedade ´Filtered´ da ZQuery para True... isso não vai influenciar em nada o resultado do select, mas vai fazer com que a ZQuery se comporte como uma IBQuery, por exemplo, trazendo para o buffer os registros, à medida que forem solicitados...
Eu acho q isso é um ´quebra-galho´ q fizeram pq está no ´Know Bugs´, mas funciona perfeitamente...
Feito isso, sua performace crescerá muito, mas vc se vc disparar um ´ZQuery.Last´ ou um ´ZQuery.RecordCount´ ae já era... vai levar os 60 segundos pq ele vai precisar trazer tudo para o buffer para mover o cursor para o final...
Espero ter ajudado...
T+
GOSTEI 0
Ffsombra
29/05/2004
Ajustei a propriedade Filtered para True, mas o comportamento não mudou em nada........ estou utilizando o Zeos 6.1.5..... Qual versão vc testou isso???
GOSTEI 0
Vinicius2k
29/05/2004
6.1.5 também... a diferença que com bancos firebird...
achei isso no Knowbugs.html na raíz de instalação da Zeos :
não diz que é restrito a um determinado banco...
Fábio, tem certeza q não está disparando nenhum método ou propriedade que invalide a opção ? como um .RecorCount, por exemplo...
T+
achei isso no Knowbugs.html na raíz de instalação da Zeos :
If you are using dbgrid, all the records will be fetched because of a call to recordcount (in scrollbar). You can avoid this behavior if you turn on the Filtered property. In this case you can achieve fast open even on bigger resultsets.
não diz que é restrito a um determinado banco...
Fábio, tem certeza q não está disparando nenhum método ou propriedade que invalide a opção ? como um .RecorCount, por exemplo...
T+
GOSTEI 0
Ffsombra
29/05/2004
Não estou o usando este método, mas estou disparando uma instrução SQL em outro componente ZQuery:
Será que isto tb pode estar interferindo???
Vou testar...
select count(*) as qtd from usu
Será que isto tb pode estar interferindo???
Vou testar...
GOSTEI 0
Ffsombra
29/05/2004
Retirei a instrução.... mas mesmo assim não funciona......
GOSTEI 0
Vinicius2k
29/05/2004
Fábio,
Sua ZQuery está ligada num DataSetProvider+ClientDataSet ?
Se estiver o ClientDataSet tbm força o fecth de todos os registros se não estiver definida a propriedade ´PacketRecords´ com a quantidade de registros desejada... e tbm, neste caso, vc pode retirar o filtered da ZQuery que não fará diferença...
Torço para que seja isso...
T+
Sua ZQuery está ligada num DataSetProvider+ClientDataSet ?
Se estiver o ClientDataSet tbm força o fecth de todos os registros se não estiver definida a propriedade ´PacketRecords´ com a quantidade de registros desejada... e tbm, neste caso, vc pode retirar o filtered da ZQuery que não fará diferença...
Torço para que seja isso...
T+
GOSTEI 0
Ffsombra
29/05/2004
Como estou fazendo testes, estava tentando utilizar sem ClientDataSet´s e DataSetProvider´s.....
Para utilizar ZQuery+DataSetProvider+ClientDataSet, é necessário atualizar alguns fontes da Zeos, pesquisei isso nos fóruns da própria Zeos.
Sem estas atualizações, se vc alterar a propriedade PacketRecords para algo diferente a -1, os registros não são visualizados...
Fiz as alterações e conversei com uma pessoa que utiliza desta maneira...
Mas ainda não consegui... Ainda vou testar mais...
Para utilizar ZQuery+DataSetProvider+ClientDataSet, é necessário atualizar alguns fontes da Zeos, pesquisei isso nos fóruns da própria Zeos.
Sem estas atualizações, se vc alterar a propriedade PacketRecords para algo diferente a -1, os registros não são visualizados...
Fiz as alterações e conversei com uma pessoa que utiliza desta maneira...
Mas ainda não consegui... Ainda vou testar mais...
GOSTEI 0