Lentidão na Busca SQL
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]
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
Curtidas 0
Respostas
Sremulador
21/05/2008
amigo o problema pode estar nos lefts e outs join,
GOSTEI 0
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:
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
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