Sql Demorada, Alguém pode me ajudar

24/10/2005

0

E ai galera!!
tenho um relatório que quando executo demora muito tempo para
aparecer os dados

Acho q talvez minha sql pode ser melhorada,
as tabelas usadas nelas tem poucos registros
exceto a ´Cadastro Conhec´ que esta com 179398 registros

O Programa roda em uma máquina cliente Atlhon 2.0 com 256mb

Servidor é uma outra máquina Atlhon 2.0 com 128 Mb, Linux Fedora 2.0
e base de dados Postgres 7.2 Máquina usada só para o sistema

Se alguém poder me dar uma ajuda Agradeço.

Minha SQL é esta ai abaixo

Query1.SQL.Clear;
Query1.SQL.Add(´SELECT´);
Query1.SQL.Add(´rde.´Num_Diario´,´);
Query1.SQL.Add(´rde.´Hora_Saida´,´);
Query1.SQL.Add(´rde.´Hora_Chegada´,´);
Query1.SQL.Add(´rde.´KM_Inicial´,´);
Query1.SQL.Add(´rde.´Sufixo´,´);
Query1.SQL.Add(´rde.´KM_Final´,´);
Query1.SQL.Add(´rde.´Data_Emissao´,´);
Query1.SQL.Add(´rde.´IDRDE´,´);

Query1.SQL.Add(´irde.´NumeroDoc´,´);
Query1.SQL.Add(´irde.´SufixoDoc´,´);
Query1.SQL.Add(´irde.´TipoDoc´,´);
Query1.SQL.Add(´irde.´IDDoc´,´);

Query1.SQL.Add(´conh.´PesoKg´ as PesoEnt,´);
Query1.SQL.Add(´conh.´Tot_Prest´ as FreteEnt,´);

Query1.SQL.Add(´conh2.´PesoKg´ as PesoCol,´);
Query1.SQL.Add(´conh2.´Tot_Prest´ as FreteCol,´);
Query1.SQL.Add(´conh2.´IDConhec´ as conhCol´);

Query1.SQL.Add(´FROM ´Cadastro RDE´ rde´);
Query1.SQL.Add(´LEFT JOIN ´Cadastro ItensRDE´ irde ON rde.´IDRDE´ = irde.´IDRDE´´);
Query1.SQL.Add(´LEFT JOIN ´Cadastro Conhec´ conh ON conh.´IDConhec´ = irde.´IDDoc´ and irde.´TipoDoc´ = ´´C´´´);
Query1.SQL.Add(´LEFT JOIN ´Cadastro Conhec´ conh2 ON conh2.´Nm_Coleta´ = irde.´NumeroDoc´ and conh2.´SufixoCol´ = irde.´SufixoDoc´ and irde.´TipoDoc´ = ´´L´´´);

Query1.SQL.Add(´ where rde.´Data_Emissao´ >= ´´´ + FormatDateTime(´yyyy/mm/dd´,DateEdit1.Date) + ´´´´);
Query1.SQL.Add(´ AND rde.´Data_Emissao´ <= ´´´ + FormatDateTime(´yyyy/mm/dd´,DateEdit2.Date) + ´´´´);
Query1.SQL.Add(´ AND irde.´Realizado´ = ´´True´´ AND irde.´TipoDoc´ <> ´´O´´´);
if EditSuf.Text <> ´´ then Query1.SQL.Add(´ AND rde.´Sufixo´ = ´´´ + EditSuf.Text + ´´´´);
Query1.SQL.Add(´ AND rde.´Motorista´ = ´´0´ + EditMotorista.Text + ´´´´);
Query1.SQL.Add(´ ORDER BY rde.´Data_Emissao´,rde.´IDRDE´´);

[quote:f6d1334aaf=´Moderação´][b:f6d1334aaf][color=blue:f6d1334aaf]Tópico movido por Vinicius2K:[/color:f6d1334aaf][/b:f6d1334aaf]
[b:f6d1334aaf][color=red:f6d1334aaf][list:f6d1334aaf][*:f6d1334aaf]Fórum original: Interbase/Firebird[/list:u:f6d1334aaf][/color:f6d1334aaf][/b:f6d1334aaf][/quote:f6d1334aaf]


Biodelphi

Biodelphi

Responder

Posts

25/10/2005

Lucianobarreto

Cara, é o seguinte, pelo que vi seu sql está bem amarrado, estruturado, mas antes de eu colocar no Delphi eu faria um teste no console ou no PGAdmin para ver o que melhor sem encaixa. Nos testes que eu fiz esses dias o uso de Join teve um rendimento pior do que voce usando ´tabela.campo = tabela2.campo´. Sem dizer que a quantidade de registros que ele retorna é consideravel então uma certa espera é suportavel.
Quais componentes de acesso a banco você usa?
Eu ainda não cheguei a ter esse tipo de problemas com demora, uso ZeosLib....

Até mais e abraços


Responder

25/10/2005

Biodelphi

Os componentes de acesso são do Zeus.

é um pouco de demora é normal para esta sql, Mas
li em algum lugar que criando indices nos campos certos
isso poderia melhorar um pouco o desempenho. Mas ja criei indices nos campos que
pensei que desse resultados mas não tive muito sucesso. Vou
tentar mudar a sql da maneira que vc aconselhou. Obrigado


Responder

25/10/2005

Silviogs

Olá amigo

não use concatenação de strings na sua query, favor usar parametros dessa forma o banco de dados tem maior possibilidade de otimização pois a query é analizada uma vez e nas proximas a sustituiçaõ de parametros é efetuada, tornando assim sua query mais otimizada.

Atenciosamente

Silvio Guedes


Responder

25/10/2005

Firekiller

Colega BioDelphi, apenas uma observação quanto a dica do colega LucianoBarreto; Se não houverem linhas compatíveis nas tabelas colocadas no Join, utilizar o comando SQL indicado poderia restringir a quantidade de registros retornados.
Quanto aos índices, na minha opinião os índices que poderiam existir seriam:

Tabela RDE:
- IRDE;
- Data_Emissao;

Tabela IRDE:
- IRDE;

Tabela Conh/Conh2:
- IDConhec;
- nmColeta;

Tente (se já não tiver feito) criar estes índices e ver se o desempenho melhora.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar