Fórum Filter do ClientDataSet está lento #403140

15/06/2011

0

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

Responder

Posts

15/06/2011

Nigro

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

Gostei + 0

15/06/2011

Ronaldo Lanhellas

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

Gostei + 0

15/06/2011

Rafael Mattos

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


Responder

Gostei + 0

15/06/2011

Ronaldo Lanhellas

OK Então .. muito obrigado pela explicação ! 
Responder

Gostei + 0

15/06/2011

Marco Salles

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 ..)


Responder

Gostei + 0

15/06/2011

Ronaldo Lanhellas

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
Responder

Gostei + 0

15/06/2011

Marco Salles

é 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

Responder

Gostei + 0

15/06/2011

Ronaldo Lanhellas

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 ?
Responder

Gostei + 0

15/06/2011

Marco Salles

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
Responder

Gostei + 0

15/06/2011

Ronaldo Lanhellas

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 /?
Responder

Gostei + 0

16/06/2011

Marco Salles

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 ???
Responder

Gostei + 0

16/06/2011

Rafael Mattos



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
Responder

Gostei + 0

16/06/2011

Marco Salles

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
Responder

Gostei + 0

16/06/2011

Wilson Junior

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.
Responder

Gostei + 0

16/06/2011

Ronaldo Lanhellas

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 ?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar