Lentidão em selects dentro do Delphi
Olá amigos Delphianos
Venho solicitar ajuda de vcs para um caso aqui
Tenho um relatório desenvolvido em Delphi 5 que roda 2 selects
para montar o mesmo.
O banco de dados é o SQLServer 2000 SP4, utilizo um componente database um datasource e dois query. não trabalhei com strings fiz tudo detro da unit atraves de ´sql.add´,
O sistema deve fazer um 1º select onde ele vai trazer os resultados a serem conferidos agrupados e contabilizados. para que ele faça o 1º select utilizo esse código.
_____________________________________________________________
[b:998bfb94d9]with [/b:998bfb94d9]DM.Q_Total_Produto do
[b:998bfb94d9]begin[/b:998bfb94d9]
[b:998bfb94d9]close[/b:998bfb94d9];
[b:998bfb94d9]sql[/b:998bfb94d9].clear;
[b:998bfb94d9]sql[/b:998bfb94d9].add(´SELECT ITUR.data, (ICTR.Cod_Num_Serie)Cartao, ICTA.transacao,´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´ICTR.Tarifa, (ICTR.produto)Cod_Produto´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´FROM Turnos ITUR, Cartao_Acesso ICTA, Cartao_Transacao ICTR´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´WHERE ITUR.Data >= ´´´ + v_data_I + ´´´´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND ITUR.Data <= ´´´ + v_data_F + ´´´´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND ITUR.Cod_Turno = ICTA.Cod_Turno´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND ICTA.Cod_Num_Serie = ICTR.Cod_Num_Serie´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND ICTA.transacao = ICTR.transacao´);
[b:998bfb94d9]sql[/b:998bfb94d9].savetofile(´C:\TEMP\SQL.TXT´);
[b:998bfb94d9]open[/b:998bfb94d9];
-------------------------------------------------------------------------------------
Este select demora em torno de 1 minuto para trazer os resultados para analize, isso é tratado posteriormente dentro do programa.
Quando começa a fazer os agrupamentos ele tem que fazer um novo teste para ver se determinado produto encaixa em um grupo especifico. onde ele dispara a rotina do outro select que segue a baixo.
_____________________________________________________________
[b:998bfb94d9]begin[/b:998bfb94d9]
[b:998bfb94d9]close[/b:998bfb94d9];
[b:998bfb94d9]sql[/b:998bfb94d9].clear;
[b:998bfb94d9]sql[/b:998bfb94d9].add(´SELECT Cod_Num_Serie,Transacao,Produto´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´FROM Cartao_Transacao´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´where Cod_Num_Serie = ´+ v_cartao);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND Transacao = ´+ inttostr(v_transacaoAnt));
[b:998bfb94d9]sql[/b:998bfb94d9].savetofile(´C:\TEMP\SQL1.TXT´);
[b:998bfb94d9]open[/b:998bfb94d9];
-------------------------------------------------------------------------------------
A funcção deste select é verificar um grupo especificos de produtos, de posse de um resultado prévio do outro select ele pega dois campos e vem pra cá testar a existencia deles, onde ele totaliza e aloca numa tabela temporaria para futura impressão no relatório.
No 1º select ele demora póuco para trazer os resultados, mas ainda sim fica com o SQL alocado em um processo, o que me trava a rede, e o segundo processo ele demora bastante para ver o 1º registro mas depois vai mais rápido, tinha dois indices que poderia utilizar e eles foram usados, gostaria de alguma sugetão no sentido de que o sistema venha a trabalhar mais rápido e desligue o banco de dados para fazer os processo de classificação e contagem de registros.
O que vcs sugerem?
Agradeço a todos desde já
Eduardo Viana de Almeida[/b]
Venho solicitar ajuda de vcs para um caso aqui
Tenho um relatório desenvolvido em Delphi 5 que roda 2 selects
para montar o mesmo.
O banco de dados é o SQLServer 2000 SP4, utilizo um componente database um datasource e dois query. não trabalhei com strings fiz tudo detro da unit atraves de ´sql.add´,
O sistema deve fazer um 1º select onde ele vai trazer os resultados a serem conferidos agrupados e contabilizados. para que ele faça o 1º select utilizo esse código.
_____________________________________________________________
[b:998bfb94d9]with [/b:998bfb94d9]DM.Q_Total_Produto do
[b:998bfb94d9]begin[/b:998bfb94d9]
[b:998bfb94d9]close[/b:998bfb94d9];
[b:998bfb94d9]sql[/b:998bfb94d9].clear;
[b:998bfb94d9]sql[/b:998bfb94d9].add(´SELECT ITUR.data, (ICTR.Cod_Num_Serie)Cartao, ICTA.transacao,´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´ICTR.Tarifa, (ICTR.produto)Cod_Produto´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´FROM Turnos ITUR, Cartao_Acesso ICTA, Cartao_Transacao ICTR´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´WHERE ITUR.Data >= ´´´ + v_data_I + ´´´´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND ITUR.Data <= ´´´ + v_data_F + ´´´´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND ITUR.Cod_Turno = ICTA.Cod_Turno´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND ICTA.Cod_Num_Serie = ICTR.Cod_Num_Serie´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND ICTA.transacao = ICTR.transacao´);
[b:998bfb94d9]sql[/b:998bfb94d9].savetofile(´C:\TEMP\SQL.TXT´);
[b:998bfb94d9]open[/b:998bfb94d9];
-------------------------------------------------------------------------------------
Este select demora em torno de 1 minuto para trazer os resultados para analize, isso é tratado posteriormente dentro do programa.
Quando começa a fazer os agrupamentos ele tem que fazer um novo teste para ver se determinado produto encaixa em um grupo especifico. onde ele dispara a rotina do outro select que segue a baixo.
_____________________________________________________________
[b:998bfb94d9]begin[/b:998bfb94d9]
[b:998bfb94d9]close[/b:998bfb94d9];
[b:998bfb94d9]sql[/b:998bfb94d9].clear;
[b:998bfb94d9]sql[/b:998bfb94d9].add(´SELECT Cod_Num_Serie,Transacao,Produto´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´FROM Cartao_Transacao´);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´where Cod_Num_Serie = ´+ v_cartao);
[b:998bfb94d9]sql[/b:998bfb94d9].add(´AND Transacao = ´+ inttostr(v_transacaoAnt));
[b:998bfb94d9]sql[/b:998bfb94d9].savetofile(´C:\TEMP\SQL1.TXT´);
[b:998bfb94d9]open[/b:998bfb94d9];
-------------------------------------------------------------------------------------
A funcção deste select é verificar um grupo especificos de produtos, de posse de um resultado prévio do outro select ele pega dois campos e vem pra cá testar a existencia deles, onde ele totaliza e aloca numa tabela temporaria para futura impressão no relatório.
No 1º select ele demora póuco para trazer os resultados, mas ainda sim fica com o SQL alocado em um processo, o que me trava a rede, e o segundo processo ele demora bastante para ver o 1º registro mas depois vai mais rápido, tinha dois indices que poderia utilizar e eles foram usados, gostaria de alguma sugetão no sentido de que o sistema venha a trabalhar mais rápido e desligue o banco de dados para fazer os processo de classificação e contagem de registros.
O que vcs sugerem?
Agradeço a todos desde já
Eduardo Viana de Almeida[/b]
Eduardo-v-a
Curtidas 0
Respostas
Emerson Nascimento
14/10/2008
sugiro a você utilizar joins explícitos. creio que da forma como está será feito o cruzamento de todos os registros pra somente depois avaliar o where.
crie índices para todos os campos utilizados no where ou no relacionamento.
sql.clear;
sql.add(´SELECT ITUR.data, ICTR.Cod_Num_Serie Cartao, ICTA.transacao,´);
sql.add(´ICTR.Tarifa, ICTR.produto Cod_Produto´);
sql.add(´FROM Turnos ITUR´);
sql.add(´inner join Cartao_Acesso ICTA on ICTA.Cod_Turno = ITUR.Cod_Turno´);
sql.add(´inner join Cartao_Transacao ICTR on ICTR.Cod_Num_Serie = ICTA.Cod_Num_Serie and ICTR.transacao = ICTA.transacao´);
sql.add(´WHERE ITUR.Data >= ´´´ + v_data_I + ´´´´);
sql.add(´AND ITUR.Data <= ´´´ + v_data_F + ´´´´);
sql.savetofile(´C:\TEMP\SQL.TXT´);
open;
crie índices para todos os campos utilizados no where ou no relacionamento.
sql.clear;
sql.add(´SELECT ITUR.data, ICTR.Cod_Num_Serie Cartao, ICTA.transacao,´);
sql.add(´ICTR.Tarifa, ICTR.produto Cod_Produto´);
sql.add(´FROM Turnos ITUR´);
sql.add(´inner join Cartao_Acesso ICTA on ICTA.Cod_Turno = ITUR.Cod_Turno´);
sql.add(´inner join Cartao_Transacao ICTR on ICTR.Cod_Num_Serie = ICTA.Cod_Num_Serie and ICTR.transacao = ICTA.transacao´);
sql.add(´WHERE ITUR.Data >= ´´´ + v_data_I + ´´´´);
sql.add(´AND ITUR.Data <= ´´´ + v_data_F + ´´´´);
sql.savetofile(´C:\TEMP\SQL.TXT´);
open;
tabela Campo indexado ----------------------------------------- Turnos Data Cartao_Acesso Cod_Turno Cartao_Transacao Cod_Num_Serie, transacao
GOSTEI 0