Sql Demorada, Alguém pode me ajudar
24/10/2005
0
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
Posts
25/10/2005
Lucianobarreto
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
25/10/2005
Biodelphi
é 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
25/10/2005
Silviogs
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
25/10/2005
Firekiller
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.
Clique aqui para fazer login e interagir na Comunidade :)