Fórum Dúvida com o ClientDataSet #333401
21/11/2006
0
Digamos que eu traga todos os registros da tabela com essa consulta (500 registros) da seguinte forma:
BuscaCDS.Close; QBusca.Close; QBusca.SQL.Clear; QBusca.SQL.Add(´select e.codigo,e.estoque,itm.itm_descricao, un.medida, cast(upper(c.descricao) as varchar) as categoria from almoxarifado.estoque e´); QBusca.SQL.Add(´join materiais.itens itm on itm.id = e.fk_item´); QBusca.SQL.Add(´join almoxarifado.unidades_medidas un on e.fk_unidade = un.id´); QBusca.SQL.Add(´join almoxarifado.categorias_materiais c on c.codigo = e.fk_categoria_material´); QBusca.SQL.Add(´where e.fk_almoxarifado = :fk_almoxarifado and c.fk_almoxarifado = :fk´); QBusca.SQL.Add(´order by e.codigo´); QBusca.Params[0].AsInteger := VFk_Almoxarifado; QBusca.Params[1].AsInteger := VFk_Almoxarifado; BuscaCDs.Open;
A consulta demora mais do que se eu usasse somente o Query. Pelo que parece ao abrir o ClientDataSet ele abre a Query que demora um pouco, depois ele ´copia´ os registros da Query para o ClientDataSet.
Com isso ele demora mais do que com o Query... eu uso essa opção pois eu posso desconectar da base e não ficar com o registro amarrado... enfim... será que existe algo a ser feito em relação a isso... ou é assim mesmo?
Estou usando o PostgreSQL com Zeos.
PS. O ClientDataSet funciona numa boa com o Zeos desde que eu não utilize o PacketRecords
Marcelo_mileris
Curtir tópico
+ 0Posts
21/11/2006
Brunolspp
vc pode obter mais exemplos e uma apostila q mostra alguams tecnicas de desenvolvimento clientdataset em:
http://cc.borland.com/Author.aspx?ID=795118
Abração
Gostei + 0
21/11/2006
Marcelo_mileris
Isso faz com que a consulta seja realizada diretamente no ClientDataSet e não como eu expliquei no primeiro post?
Gostei + 0
21/11/2006
Brunolspp
Abração
Gostei + 0
21/11/2006
Marcelo_mileris
BuscaCDS.Close; QBusca.Close; QBusca.SQL.Clear; QBusca.SQL.Add(´select e.codigo,e.estoque,itm.itm_descricao, un.medida, cast(upper(c.descricao) as varchar) as categoria from almoxarifado.estoque e´); QBusca.SQL.Add(´join materiais.itens itm on itm.id = e.fk_item´); QBusca.SQL.Add(´join almoxarifado.unidades_medidas un on e.fk_unidade = un.id´); QBusca.SQL.Add(´join almoxarifado.categorias_materiais c on c.codigo = e.fk_categoria_material´); QBusca.SQL.Add(´where e.fk_almoxarifado = :fk_almoxarifado and c.fk_almoxarifado = :fk´); QBusca.SQL.Add(´order by e.codigo´); BuscaCDS.FetchParams; BuscaCDS.Params[0].AsInteger := VFk_Almoxarifado; BuscaCDS.Params[1].AsInteger := VFk_Almoxarifado; BuscaCDS.Open;
Foi dessa forma que vc se referiu?
Gostei + 0
21/11/2006
Brunolspp
mas pq vc naum deixa o comando direto na query e so passa os parametros pelo cds, dai é só
BuscaCDS.Close;
BuscaCDS.Params[0].AsInteger := VFk_Almoxarifado;
BuscaCDS.Params[1].AsInteger := VFk_Almoxarifado;
BuscaCDS.Open;
abração
Gostei + 0
21/11/2006
Marcelo_mileris
Agradeço a ajuda... realmente ficou um pouco mais rápido o ClientDataSet para trazer os resultados.
Gostei + 0
21/11/2006
Marcelo_mileris
Gostei + 0
21/11/2006
Titanius
[]s
Gostei + 0
21/11/2006
Brunolspp
para construção de sqldinamico vc pode usar o clientdataset tb..
e so habilitar a opção allowcommandtext com datasetprovider..
se clientdataset for so de consulta, desabilita a propriedade getmetadata da query q melhora a performance tb
abração
Gostei + 0
21/11/2006
Marco Salles
O clientDataSet armazena tudo na memória , isto faz com que a aplicacção seje responsável pelo cache dos dados... Todos os dados de uma consulta são trazidos para a memoria
Quando se abre uma query, é o BDE que coordena a busca dos dados, so que ele não coloca todos os dados de uma so vez...
Para entender esta diferença , vamos supor que voce tenha uma tabela com muitos registros e um botão que coloque a query no ultimo registro(método last) .. Abra a aplicaçãoe , imediatamente apos ser mostrado o primeiro registro, pare o servidor da aplicação e click no botão... Voce receberá uma exceção...
Outra coisa muito importante , o tempo que voce espera usando uma query com o BDE , para abrir uma aplicação desse tipo é muito menor que o tempo que voce espera para abrir uma aplicação usando o clientDataSet
Existem alem de outras tecnicas de meçlhorar a performance do ClientDatset , voce definir o numero de registros que se deseja trazer , em cada operação utilizando o clientedataset.. Esta também é uma boa opção
Gostei + 0
21/11/2006
Brunolspp
eu deixei varios exemplos praticos de tecnicas com codigo fonte do q usei em varios sistemas comerciais de alta performance, requisição e disponibilidade, td baseado em datasnap e 99¬ em BSS.
Tem bastante coisa la rpa ajudar
eis o link: http://cc.borland.com/Author.aspx?ID=795118
e no mais estou aki para o que precisar
;)
Abração
Gostei + 0
21/11/2006
Marcelo_mileris
- Base de dados Firebird com 65031 registros (Claro que ninguem (acho eu né :D) faria uma consulta trazendo toda essa quantidade de registros... porém somente assim consegui ver a diferença de tempo)
[b:0f910ec8da]Componentes:[/b:0f910ec8da]
IBDatabase -> TIBTransaction -> IBQuery - DataSetProvider -> ClientDataSet
Consulta com o SQL direto na IBQuery sendo aberta pelo ClientDataSet:
Tempo: 00:02:11 (Dois minutos e 11 segundos)
Consulta com o SQL direto no CommandText do ClientDataSet:
Tempo: 00:01:41 (1 minuto e 41 segundos)
---
Alterando as propriedades ProviderFlags dos Fields adicionados no ClientDataSet (exceto chave primária) para:
[b:0f910ec8da]pfInUpdate [/b:0f910ec8da]- True
[b:0f910ec8da]pfInWhere[/b:0f910ec8da] - False
[b:0f910ec8da]pfInKey[/b:0f910ec8da] - False
[b:0f910ec8da]pfHidden[/b:0f910ec8da] - False
Chave Primária:
[b:0f910ec8da]pfInUpdate [/b:0f910ec8da]- True
[b:0f910ec8da]pfInWhere[/b:0f910ec8da] - True
[b:0f910ec8da]pfInKey[/b:0f910ec8da] - True
[b:0f910ec8da]pfHidden[/b:0f910ec8da] - False
Alterando também o UpdateMode do DataSetProvider para [b:0f910ec8da]upWhereKeyOnly[/b:0f910ec8da]
Tempo: 00:01:37 (1 minuto e 37 segundos)
Levando em conta o tempo de retorno com cada uma das configurações... ficou claro que o ClientDataSet com algumas configurações fica quase duas vezes mais rápido.
Agora o porque que mudando aquelas ´flags´ ele fica mais rápido eu não sei... somente me falaram que assim ficaria mais rápido porém não souberam me explicar direito... se alguem souber
Gostei + 0
22/11/2006
Marco Salles
eu não trabalho com os IB ,[b:6d7803019d] mas a explicação com certeza é a mesma encontrada , quando se trabalha com os componentes DbExpress[/b:6d7803019d]
Se no IB voce tiver a oportunidade de colocar um Componente que irá ´visualizar´ e detalhar como esta sendo processada o seu Sql , voce podera chegar a algumas conclusões .. [b:6d7803019d]No DbExpress esse componente se chama TSqlMonitor e explicação seria assim:[/b:6d7803019d]
[b:6d7803019d]Em outra palavras voce trocara menos informação com o Servidor..[/b:6d7803019d]
Gostei + 0
22/11/2006
Titanius
Bem, isto é meio que óbvio, pois setando o DataSetProvider para upWhereKeyOnly, na hora que ele vai gerar o SQL ele gera levando em conta a chave primária, ou seja, o campo que você marcar como pfInKey.
O ideal é você marcar lá no ClientDataSet, como [b:490fcc1d46]pfInKey := True e pfInWhere := True[/b:490fcc1d46] todos os campos que fazem parte de sua [b:490fcc1d46]chave primária[/b:490fcc1d46], assim o retorno será muito mais rápido.
Espero ter sido claro..
[]s
Gostei + 0
22/11/2006
Brunolspp
:D
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)