Filter do ClientDataSet está lento
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 ?
Alguma dica ?
Ronaldo Lanhellas
Curtidas 0
Respostas
Nigro
15/06/2011
Ronaldo, se você tem a solução, por que continua usando Filter?
GOSTEI 0
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
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
15/06/2011
OK Então .. muito obrigado pela explicação !
GOSTEI 0
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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 ?
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
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 ?
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é
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