Filter do ClientDataSet está lento

Delphi

15/06/2011

Bom gente, uso costumeiramente o método Filter do ClientDataSet porém com uma grande quantidade de registros percebi que ele torna-se muito lento, demorando até de 1 a 2 minutos para mostrar os dados requisitados, diferente se eu usar direto o CommandText, que mostra bem rápido os registros.  já tentei colocar o PackRecord para 50 e continua a mesma coisa..
Alguma dica ?
Ronaldo Lanhellas

Ronaldo Lanhellas

Curtidas 0

Respostas

Nigro

Nigro

15/06/2011

Ronaldo, se você tem a solução, por que continua usando Filter?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/06/2011

Porque eu gostaria de ter uma resposta, saber o porque o Filter fica tão lento ? Que tipo de busca ele faz ? 
GOSTEI 0
Rafael Mattos

Rafael Mattos

15/06/2011

Porque eu gostaria de ter uma resposta, saber o porque o Filter fica tão lento ? Que tipo de busca ele faz ? 



filter é uma opçao da query, mesmo com ele, quando vc fazer a pesquisa ele vai trazer todos os registro da tabela, imagina todos os dados trafegando na rede é porisso que é lento, depois que ele traz todos os dados que ele vai aplicar o filtro.

diferente se vc usar o select do commandText como vc citou(ELA VAI PEDIR JA OS DADOS FILTRADO PARA O BANCO DE DADOS), ele traria sómente os registro que vc pedio para o banco diminuindo o trafico na rede, e indo mais rapido




--------------------------------------------------------------------------------
Blog: http://mundodoprogramador.wordpress.com/
MSN: rafmattos@hotmail.com
Twitter: _rafmattos


GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/06/2011

OK Então .. muito obrigado pela explicação ! 
GOSTEI 0
Marco Salles

Marco Salles

15/06/2011

Porque eu gostaria de ter uma resposta, saber o porque o Filter fica tão lento ? Que tipo de busca ele faz ? 


filter é uma opçao da query, mesmo com ele, quando vc fazer a pesquisa ele vai trazer todos os registro da tabela, imagina todos os dados trafegando na rede é porisso que é lento, depois que ele traz todos os dados que ele vai aplicar o filtro.

diferente se vc usar o select do commandText como vc citou(ELA VAI PEDIR JA OS DADOS FILTRADO PARA O BANCO DE DADOS), ele traria sómente os registro que vc pedio para o banco diminuindo o trafico na rede, e indo mais rapido



Discordo . O Filtro no clientDataSet é aplicado aos dados que estão na memória . Uma operação muito mais
rápida e indicada do que trafegar dados pela Rede ou acessar BD . Não consome recurso de Rede , pode ate
desconectar o Banco que ira funcionar

Além disso o CommandText para quem esta interressado na arquitetura DataSnap é desaconselhavel. Lugar
de SQl é no Servidor de APlicação

Tem que ver como vc esta aplicando o Filtro .. Vc não esta fechando o CDS ?? Esta ????

Obs .. O PackRecord não tem nada a ver com o Filtro , serve para dados em demanda ( Trazer os Dados por
demanda , diminuir o Tráfego ..)


GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/06/2011

Opa, já estava preocupado em saber que o Filter "puxa" todos os dados do banco mesmo filtrandos. (O que tambem achei muito estranho).

 BOm Marcos, para utilizar o Filter eu geralmente faço :

With ClientDataSet do
begin
Close;
Filtered := False;
Filter := 'ID = '+QuotedStr('3');
Filtered := true;
open;
end
GOSTEI 0
Marco Salles

Marco Salles

15/06/2011

é so fazer assim

With ClientDataSet do
begin
Filtered := False;
Filter := 'ID = '+QuotedStr('3');
Filtered := true;
end

Não precisa do Close e nen do Open .. Pois ai sim vc esta realizando uma nova requisição no Banco

GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/06/2011

mais se eu fizer apenas isso que voce descreveu com o ClientDataSet já aberto, não aconteçe nada.. eu teria que dar um Refresh correto ?
GOSTEI 0
Marco Salles

Marco Salles

15/06/2011

mais se eu fizer apenas isso que voce descreveu com o ClientDataSet já aberto, não aconteçe nada.. eu teria que dar um Refresh correto ?


O Filtro so deve ser aplicado quando o clientDataSet tiver dados carregados . Vc não pode aplicar um filtro em um
clientDatSet Vazio .. Para carregar o ClientDatSet usa-se Sql ... O próprio Open e Close carrega o ClientDatSet
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/06/2011

sim sim entendi, mais por exemplo: O CDS ta aberto com todos os dados carregados via SQL, agora posso deixar ele aberto em toda aplicação e quando desejar buscar determinado registro apenas utilizar o Filter e logo após o Refresh para nao precisar fechá-lo  ok /?
GOSTEI 0
Marco Salles

Marco Salles

15/06/2011

sim sim entendi, mais por exemplo: O CDS ta aberto com todos os dados carregados via SQL, agora posso deixar ele aberto em toda aplicação e quando desejar buscar determinado registro apenas utilizar o Filter e logo após o Refresh para nao precisar fechá-lo  ok /?

Para que o Refresh ???? O Refresh é quase um open / close com alguma diferença

Quando o Cds esta carregado e vc quer buscar determinado registro basta utilizar o Filtro.  Agora se vc tiver
em uma Rede , em uma situação que os dados estão sofrendo constantes variaçoes , o filtro não ira atualizar
os seus dados

Por exemplo , vc quer pesquisar um cliente chamado MARCO na sua base de dados .. O Seu Cds esta carregado
(a dois minutos atrás com todos os clientes (uma operaçõe danosa , mas tudo bem) ...Em um outro Micro conectado
a Rede , é inserido o Cliente MARCO . Quando vc aplicar um Filtro , vc não encontrará o MARCO ... Mas se vc der
um Refresh ou Close/OPen (depedendo do seu Sql...) , ele atualizar a aBAse de Dados e carregara o CDS com os
Novos Registros e ao Utilizar o Filtro voce encontrara o MARCO .

Então não é o Filtro que é lento , mas talves a forma que vc o esta querendo utilizar .. Depedendo será melhor
utilizar um Sql LIKE para encontrar especificamente os clientes chamados "MARCO" do que dá um REfresh ou
open/close seguido de Filtro .. POr isto que seu Filtro esta aparentemente Lento

entendeu ???
GOSTEI 0
Rafael Mattos

Rafael Mattos

15/06/2011



Discordo . O Filtro no clientDataSet é aplicado aos dados que estão na memória .



sim é nos dados da memoria mesmo, mas a primeira vez q vc abre a query se o filtro não tiver no select vai trazer todos



exemplo tenho uma tabela cliente com 10000 registro

meu select é

select * from CLIENTE


vou colocar o filter só para trazer o registro 3? certo?
With ClientDataSet do 
begin
   Filtered := False;
   Filter := 'ID = '+QuotedStr('3');
   Filtered := true;

   Open;
end


no DBGrid ele vai mostrar certinho só o cliente 3( Vai demorar um pouco pq ele vai trazer todos os meu dados para memora só para filtrar o registro 3)

mas quantos dados ele trafego nesse OPEN? TODOS os meus 10000 registro só para mostrar 1 registro.

----------------------------------------------------------------------------------------





agora se vc traz já filtrando no o select


ele só trafega 1 registro


select * from CLIENTE
where ID = 3








--------------------------------------------------------------------------------
Blog: http://mundodoprogramador.wordpress.com/
MSN: rafmattos@hotmail.com
Twitter: _rafmattos
GOSTEI 0
Marco Salles

Marco Salles

15/06/2011

Não é o filtro que demora é o Select ...

O filtro so deve ser aplicado nos dados que estão em memória e são dados locais

Para trazer novos dados utilise o Sql com clausu-la where

Apos isto pode se filtrar novamente as informações
GOSTEI 0
Wilson Junior

Wilson Junior

15/06/2011

Concordo com o que o Marco comentou, está exatamente CORRETO.
Só resumindo o que já foi dito:
  - Open: retorna os dados do Banco de dados para a memória do ClientDataSet, ou seja, executa o SQL (demora conforme a quantidade de registros);
  - Filter: filtra os dados da memória do ClientDataSet (geralmente rápido).

Portanto, para utilizar o filter, é preciso carregar a memória do ClientDataSet.

Espero ter colaborado.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/06/2011

Bom .. pensei na seguinte solução para evitar que o usuário final reclame: "ESTÁ MUITO LENTO ESSA BUSCA" :D
 Ao inciar a aplicação, são abertos todos os ClientDataSet que estão no DataModule. E dentro da aplicação só utilizo o Filter mesmo, oque fica bem mais rápido.  No caso do funcionamento em REDE, basta colocar um botão de Atualizar para que o usuário possa manualmente atualizar os registros daquela tabela.
 O que vocês acham ?
GOSTEI 0
Rafael Mattos

Rafael Mattos

15/06/2011

Bom .. pensei na seguinte solução para evitar que o usuário final reclame: "ESTÁ MUITO LENTO ESSA BUSCA" :D
 Ao inciar a aplicação, são abertos todos os ClientDataSet que estão no DataModule. E dentro da aplicação só utilizo o Filter mesmo, oque fica bem mais rápido.  No caso do funcionamento em REDE, basta colocar um botão de Atualizar para que o usuário possa manualmente atualizar os registros daquela tabela.
 O que vocês acham ?


problema é o uso de memoria do computador

GOSTEI 0
José

José

15/06/2011

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0
POSTAR