tClientDataSet muito lento, alguém pode ajudar?
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.
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
Curtidas 0
Respostas
Wagnerps
08/07/2003
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.
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
Após Salvar Limpo o Dataset
e continuo a inserção.
Espero ter ajudado.
Falow... :wink:
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:
GOSTEI 0
Emacruz
08/07/2003
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.
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.
GOSTEI 0
Fred
08/07/2003
voce esta utilizando os tres componentes DataSet+ClientDataSet+Provider??????Corretamente Ligados????????
e outra coisa a query fica fechada!!
so o ClientDataset é aberto! 8)
e outra coisa a query fica fechada!!
so o ClientDataset é aberto! 8)
GOSTEI 0
Emacruz
08/07/2003
Estou sim, estou com um tSQLQuery ligado em um Provider que por sua vez está ligado no tClientDataSet..
GOSTEI 0
Flaviodfp
08/07/2003
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.
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.
GOSTEI 0