Lentidão na Busca SQL

Firebird

21/05/2008

Boa tarde,

estou montando uma SQL, para consulta de algumas informações, e no final da SQL, coloquei a instrução de ORDER BY, dai surgiu o problema.
Quando eu executo a instrução, sem a cláusula de order by, além de trazer um número menor de registros, a sql executa rápido. Quanto eu coloco a cláusula de order by, o resultado é o correto, porém demora muito para executar a sql.
Os campos do Order By são chaves da tabela.
Abaixo segue sql para melhor entendimento.
Depois da SQL, segue a estatísticas de registros lidos com e sem a ordenação

Att

Francis

SELECT *
FROM CONHECIMENTOS CONH
LEFT OUTER JOIN MANIFESTOS MANI
ON ( MANI.COD_EMPRESA = CONH.COD_EMPRESA AND
MANI.MANIFESTO = CONH.MANIFESTO )

LEFT OUTER JOIN CLIENTES CLIE
ON ( CLIE.COD_CLIENTE = CONH.DESTINATARIO )

LEFT OUTER JOIN REGIOES_AREAS AREA
ON ( ( CLIE.E_CEP >= AREA.CEP_INICIO || ´000´ ) AND
( CLIE.E_CEP <= AREA.CEP_FINAL || ´999´ ) AND
( MANI.DESTINO = AREA.COD_EMPRESA ) )

LEFT OUTER JOIN EMPRESAS EMPR
ON ( EMPR.COD_EMPRESA = MANI.DESTINO )

WHERE ( CONH.DATA_EMISSAO >= ´08/01/2007´ )
AND ( CONH.DATA_EMISSAO <= ´10/30/2007´ )
AND ( CONH.FLAG_CANCELADO < 1 )
AND ( ( CONH.TIPO_FRETE <= 1 )
OR ( CONH.TIPO_FRETE > 4 ) )

ORDER BY MANI.DESTINO, CONH.COD_EMPRESA, CONH.CONHECIMENTO

ESTATÍSTICAS COM A CLÁUSULA ORDER BY
TABLE INDEXED
Regioes_Areas 3.961.50
Empresas 23.706
Clientes 22.424
Manifestos 22.413
Conhecimentos 23.370


ESTATÍSTICAS SEM A CLÁUSULA ORDER BY
TABLE INDEXED
Regioes_Areas 9.283
Empresas 88
Clientes 86
Manifestos 86
Conhecimentos 87[code:1:324b47dab0][/code:1:324b47dab0]


Chiquimmn

Chiquimmn

Curtidas 0

Respostas

Sremulador

Sremulador

21/05/2008

amigo o problema pode estar nos lefts e outs join,


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

21/05/2008

o fato de ter ou não ter o [i:35b9e1937b]order by[/i:35b9e1937b] não deveria alterar o número de registros resultantes da pesquisa.
tente assim:
SELECT
  *
FROM
  MANIFESTOS MANI
INNER JOIN -- INNER MESMO
  CONHECIMENTOS CONH ON ( CONH.COD_EMPRESA = MANI.COD_EMPRESA  
    AND CONH.MANIFESTO = MANI.MANIFESTO
    AND CONH.FLAG_CANCELADO < 1
    AND ( CONH.TIPO_FRETE <= 1 OR CONH.TIPO_FRETE > 4 ) )
LEFT JOIN
  CLIENTES CLIE ON ( CLIE.COD_CLIENTE = CONH.DESTINATARIO )
LEFT JOIN
  REGIOES_AREAS AREA ON ( AREA.COD_EMPRESA = MANI.DESTINO
--    AND ( CLIE.E_CEP BETWEEN AREA.CEP_INICIO || ´000´
--          AND AREA.CEP_FINAL || ´999´ ) )
--    AND ( SUBSTRING(CLIE.E_CEP FROM 1 FOR 5) BETWEEN AREA.CEP_INICIO
--          AND AREA.CEP_FINAL ) )
    AND ( AREA.CEP_INICIO || ´000´ <= CLIE.E_CEP
          AND AREA.CEP_FINAL || ´999´ >= CLIE.E_CEP ) )
LEFT JOIN
  EMPRESAS EMPR ON ( EMPR.COD_EMPRESA = MANI.DESTINO )
WHERE
  CONH.DATA_EMISSAO BETWEEN ´08/01/2007´ AND ´10/30/2007´
ORDER BY
  MANI.DESTINO, CONH.COD_EMPRESA, CONH.CONHECIMENTO

eu alterei a ordem das tabelas para ver se melhora a seletividade dos registros; alterei também as condições de relacionamento. talvez ajude um pouco.
mas volto a afirmar: o uso do [i:35b9e1937b]order by[/i:35b9e1937b] não deveria interferir no número de registros resultantes.
se continuar ocorrendo, passe um gfix no seu banco de dados. talvez ele esteja com algum problema.

uma dica: para que a performance melhore, os campos utilizados no relacionamento entre as tabelas devem estar indexados.
por exemplo: para melhorar a performance da instrução acima, a tabela CONHECIMENTO deveria ter um índice pelos campos COD_EMPRESA e MANIFESTO


GOSTEI 0
POSTAR