Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Eduardo-V-A

Lentidão em selects dentro do Delphi

Recommended Posts

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.

_____________________________________________________________

with DM.Q_Total_Produto do

begin

close;

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, Cartao_Acesso ICTA, Cartao_Transacao ICTR');

sql.add('WHERE ITUR.Data >= ''' + v_data_I + '''');

sql.add('AND ITUR.Data <= ''' + v_data_F + '''');

sql.add('AND ITUR.Cod_Turno = ICTA.Cod_Turno');

sql.add('AND ICTA.Cod_Num_Serie = ICTR.Cod_Num_Serie');

sql.add('AND ICTA.transacao = ICTR.transacao');

sql.savetofile('C:\TEMP\SQL.TXT');

open;

-------------------------------------------------------------------------------------

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.

_____________________________________________________________

begin

close;

sql.clear;

sql.add('SELECT Cod_Num_Serie,Transacao,Produto');

sql.add('FROM Cartao_Transacao');

sql.add('where Cod_Num_Serie = '+ v_cartao);

sql.add('AND Transacao = '+ inttostr(v_transacaoAnt));

sql.savetofile('C:\TEMP\SQL1.TXT');

open;

-------------------------------------------------------------------------------------

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]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha... uma boa idéia seria usar subqueries...

Assim, você evitaria ter que relacionar todos os registros de ITUR com ICTA

e ICTA com ICTR, só para depois filtrar o período...

Veja que, se as três tabelas tivessem 10 registros cada uma, você

teria 10 X 10 X 10 = 1000 relações... amplie isto para a quantidade

real de registros que você tem para ter uma idéia melhor de quando

usar uma query que possa levar muito tempo para ser processada...

Mas voltando ao seu código (apenas sugestão):

 

select itur.data, (ictr.cod_num_serie) cartao, icta.transacao,
	   ictr.tarifa, (ictr.produto) cod_produto
from turnos itur
left outer join cartao_acesso icta
  on (itur.cod_turno=icta.cod_turno)
left outer join cartao_transacao ictr
  on (icta.cod_num_Serie=ictr.cod_num_serie and
	  icta.transacao = ictr.transacao)
where itur.data between "06/15/2008" and "06/30/2008";

Ah... experimente executar a query antes usando o DBExplorer que

vem com o Delphi... é mais fácil "destruí-lo" se o processamento ficar

"travado" do que a sua aplicação ou a própria IDE do Delphi (se você

usar o SQLBuilder p.e.)

 

Ok?

Espero ter contribuido...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.