Abrir Tabela enorme com FDQuery

Delphi

12/01/2014

Olá, estou usando Delphi XE5 + FB 2.5... o problema que estou enfrentando é: tabela com 50.000 registros com FDQuery abre beleza, mas tenho uma tabela com 1.669.353 regitros
preciso fazer uma correção geral na tabela e quanto tento Active = True fica em processo interminavel e gerenciador de tarefas do Windows 8 diz q programa não responde.
alguem mais experiente e já conhece FDQuery do FireDac pode me ajudar nesse quesito. fico grato a todos.
Everaldo Silva

Everaldo Silva

Curtidas 0

Respostas

Maicon Wagner

Maicon Wagner

12/01/2014

Rapaz, Na empresa que trabalho também temos bastante clientes com quase 2 Milhões de registros em algumas tabelas, para abrir todos os registros de uma vez demora mesmo, utilizamos banco Oracle. A solução?

1- Tivemos que revisar todas as tabelas e criar alguns índices melhores nas tabelas.
2- Ao fazer uma consulta sempre fazemos dos campos específicos, evitamos utilizar "SELECT * FROM", pois tem vezes que nunca queremos todos os campos.
3- Ao fazer a consulta não fazemos a consulta de todos os registros, parametrizamos uma variável que eh a quantidade de registros que a query busca de cada vez. Fazendo assim quando você estiver num grid, ira aparecer no grid sempre a quantidade especificada + a nova consulta.

Bom para nos isso deu certo, mas caso você queira retornar mesmo todos os registros de uma vez, creio que terá uma demora mesmo em sua requisição. Ainda mais se tiver campos com Blob.
GOSTEI 0
Everaldo Silva

Everaldo Silva

12/01/2014

na verdade meu select é bem pequeno a nível de teste essa Tabela TB_ENDERECO tem mais de 1.600.000 registros ' SELECT END_CIDADE, END_CID_ID, END_BAIRRO, END_BAI_ID FROM TB_ENDERECO' sem relacionamento, exclusivamente só isso, porem uma outra tabela com 50.000 abre beleza, a pedra de tropeço é: quando tento ativar a FDQryEndereco Atcive:=True; no Caption o Form1 aparece "Não está respondendo" e ja deixei o pc nesse processo uma noite inteira e nada de abrir a tabela, fica um circulo de processamento girando e não abre e não acontece nada e para piorar a situação a IDE do XE5 não responde para encerra o delphi só pelo Gerenciador de Tarefas e para complicar mais um puquinho trava o serviço do Firebird de nem pelo IBExpert consigo conectar com o Banco de Dados FB, só reiniciando o PC.

Configuração do PC:
Quad Core
HD 512 novo e formatado a 10 dias
8gb de mem
Placa Mãe Intel
Clock de 2.8Ghz
Windows 8

Agradeço a ajuda e colaboração de todos que puderem me ajudar.


GOSTEI 0
Maicon Wagner

Maicon Wagner

12/01/2014

na verdade meu select é bem pequeno a nível de teste essa Tabela TB_ENDERECO tem mais de 1.600.000 registros ' SELECT END_CIDADE, END_CID_ID, END_BAIRRO, END_BAI_ID FROM TB_ENDERECO' sem relacionamento, exclusivamente só isso, porem uma outra tabela com 50.000 abre beleza, a pedra de tropeço é: quando tento ativar a FDQryEndereco Atcive:=True; no Caption o Form1 aparece "Não está respondendo" e ja deixei o pc nesse processo uma noite inteira e nada de abrir a tabela, fica um circulo de processamento girando e não abre e não acontece nada e para piorar a situação a IDE do XE5 não responde para encerra o delphi só pelo Gerenciador de Tarefas e para complicar mais um puquinho trava o serviço do Firebird de nem pelo IBExpert consigo conectar com o Banco de Dados FB, só reiniciando o PC.

Configuração do PC:
Quad Core
HD 512 novo e formatado a 10 dias
8gb de mem
Placa Mãe Intel
Clock de 2.8Ghz
Windows 8

Agradeço a ajuda e colaboração de todos que puderem me ajudar.





Amigo voce ja tentou fazer esta consulta pelo banco ? Tenta fazer essa consulta diretamente no banco e posta para gente ver qual o resultado ?
GOSTEI 0
Everaldo Silva

Everaldo Silva

12/01/2014

Olá Maicon, fiz o teste e descobri q essa tabela foi pro espaço, creio que devido a interrupções bruscas pode ter corrompido a Tabela, as demais estão ok,
mas com um bom cidadão tenho backups e testei o mais recente e esta tudo ok. Muito obrigado pela dica, não te informei a mais tempo prq meu provedor de internet
estava com problemas, um abraço, kara essa tabela tem uma incosistência e to fazendo correção, uso o XE5 como citado anteriormente e usando FireDac que jé e nativo nesta versão XE5, faço um seclet com paginação de 50 registro por pagina e o programa quando inicializa os primeiros 20.000 registro processa bem rapido mas, o bicho quando a medida q avança, a peformance cai drasticamente, então o que faço é: Nesta tabela de Endereço preciso verificar quais endereços estão sem referência com a tabela de Bairro, então zerei toda referência End_Bai_ID chave estrangeira pela que é o relacionamento entre TB_Endereco/TB_Bairro, e faço uma pesquisa usando Locate pelo nome do Bairro que há na TB_Endereço field End_Bairro o codigo é bem simple

with FDQryEndereco do
begin
while not(Eof) do //Executa enquanto nao for o fim Tb_Endereco
begin
if FDQryBairro.Locate('BAI_UF; BAI_CIDADE; BAI_NOME',
VarArrayOf( [ FieldByName('END_UF').AsString,
FieldByName('END_CIDADE').AsString,
FieldByName('END_BAIRRO').AsString ] ), []) then
begin
FieldByName('Novo_Bai_ID').AsInteger := FDQryBairro.FieldByName('Bai_ID').AsInteger;
. . .
end
else
begin
with FDQryBairro do
begin
append;
. . .
post;
ApplyUpdates(0);
end;
end;

next

if vContRegistro >50 the
begin
ApplyUpdates(0);

vGetNextRecord := vGetNextRecord + vContRegistro; // incremente sempre + 50 para buscar os próximos 50 registros

vContRegistro := 1;

. . .// aqui há uma chamada de uma procedure que refaz o "Select First 50 Skip vGetNextRecord campos da tabela endereco "
end ;
end;
end;

creio que é bem simples e funcional, se possível me liga que te retorno, meu Cel: Tim 041-75-9164-6423 ou Claro 021-75-8131-4335






GOSTEI 0
POSTAR