Fórum tClientDataSet muito lento, alguém pode ajudar? #168350

08/07/2003

0

Tenho o seguinte problema, tenho uma tabela de cliente que possui um pouco mais que 16.300 registros. Como o dbExpress é unidirecional passei a utilizar o tClientDataSet para exibir, alterar e excluir dados.
A sql existente no tSQLQuery é simples:
´SELECT * FROM TABCLI ORDER BY NOME´, onde o campo nome já possui índice para agilizar a pesquisa.
Se eu der um Open na query ela é aberta de forma extremamente rápida, afinal é unidirecional, porém quando eu vou abrir o tClientDataSet ele demora muito, mas muito mesmo, algo em torno de 50 a 65 segundos!

Cheguei a colocar na propriedade IndexFieldNames alguns campos(CODIGO_TABCLI, NOME E CODIGO) porém não resultou em nenhuma melhora..

Alguém poderia me dar uma dica ou mesmo me dizer se possui algum ´macete´ neste componente?

Obrigado desde já,
Emanuel.


Emacruz

Emacruz

Responder

Posts

08/07/2003

Wagnerps

Ola,

emacruz vc precisá carregar os 16.300 registros de uma só vez mesmo ?

olha uso DBExpress e tenho um tabela com pouco mais 430.000 registros
e não tenho tanto problema quanto a performance.

Quando carrego o form passo o seguinte comando.

obs: tenho 3 chaves primarias.

dmDados.ClientDataSet.Commandtext := ´SELECT * FROM TABELA WHERE ID1 = 0 and ID2 = 0 and ID3 = 0´
dmDados.ClientDataSet.Close;
dmDados.ClientDataSet.Open;


No ClientDataset tem uma propriedade PacketRecords,
o valor Default dela e -1 então quanto vc dá um open ele carrega todos os registros, mas se vc mudar no caso para 10 o ele vai trazer para vc um pacote com 10 Regitros apenas.

depois continuo assim:

Após o insert ou Append na hora de salvar faço o seguinte
dmDados.ClientDataSet.Post;
dmDados.ClientDataSet.ApplyUpdates(-1);


Após Salvar Limpo o Dataset

dmDados.ClientDataSet.EmptyDataset;


e continuo a inserção.


Espero ter ajudado.

Falow... :wink:


Responder

Gostei + 0

08/07/2003

Emacruz

Qual SGDB que vc usa? Tentei utilizar o CommandText mas continuou dando problema, quanto ao PacketRecords, eu já utilizei mas a princípio fui instruído a não utilizá-lo, mas sim tentar fazer com que o tClientDataSet abra os registros de forma rápida. Esqueci de mencionar mas o SGDB utilizado é o Interbase. Estranho o fato de ser uma instrução SQL simples (´SELECT * FROM TABCLI ORDER BY NOME´), sendo que o campo NOME já está indexado no Interbase. Após algumas pesquisas em fóruns descobri que o tClientDataSet não ´reconhece´ os índices do mesmo, ou seja, teriam que ser colocados na propriedade IndexFieldNames ou IndexName, após o índice ser criado na mão no tClientDataSet. O problema (ainda) não é nem fazer um Update, até porque quando faço um ApplyUpdate na mesma tabela com os mesmos registros ele demora mais ou menos o tempo que ele leva para abrir.
Meu problema, pelo menos por enquanto, seria no ´Open´ propriamente dito. Não sei nem se estou atribuindo os índices no tClientDataSet de forma errônea... chato mesmo é ver o tSQLQuery abrir a mesma consulta em menos de um segundo entende?

Grato desde já a sua atenção,
Emanuel.


Responder

Gostei + 0

08/07/2003

Fred

voce esta utilizando os tres componentes DataSet+ClientDataSet+Provider??????Corretamente Ligados????????

e outra coisa a query fica fechada!!

so o ClientDataset é aberto! 8)


Responder

Gostei + 0

09/07/2003

Emacruz

Estou sim, estou com um tSQLQuery ligado em um Provider que por sua vez está ligado no tClientDataSet..


Responder

Gostei + 0

01/08/2003

Flaviodfp

Olá,
Tente colocar a sua Query o comoando Limit, assim:
´SELECT * FROM TABCLI ORDER BY NOME, Limit 20´

O Limit 20 seria a qtde de linha da sua dbgrid, assim toda vez q o usuário clicar PageUP ou PageDown, a Query irá mostrar os próximos 20 registros ou os 20 resgistros anteriores.

Seria bom se você checasse as tabelas para verificar se existem algum problemas com elas. Eu utlizo o MySQL e este tipo de problema não acontece.

Ats,

Flávio.


Responder

Gostei + 0

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

Aceitar