[firebase-br] Ajuda c/ Otimização de SQL (Muito importante!)!!!

Kleber Caneva kdcc em terra.com.br
Qua Jan 16 11:50:14 -03 2008


Sugestões:

- Crie For aninhados.  Primeiro faça um FOR na tabela OPERACOES e só depois 
faça o For para PROCESSADOS, com isso vc não precisará do Group by

- Não use COUNT(*), use COUNT(1) - O banco precisa de uma operação a mais 
para entender o *

- Pq vc está usando CASE nessa linha ?
     CASE WHEN COUNT(*) > 1 THEN COUNT(*) ELSE 0 END CICLOS,

[]´s

Kléber Caneva


----- Original Message ----- 
From: "Roger" <pikurim em hotmail.com>
To: <lista em firebase.com.br>
Sent: Wednesday, January 16, 2008 8:50 AM
Subject: [firebase-br] Ajuda c/ Otimização de SQL (Muito importante!)!!!


Bom dia, estou com um dilema super urgente! tenho uma
tabela c/ 2 milhões de registros e a cada mês ela aumenta
uns 150 mil registros.

Possuo uma SP de consulta:

SELECT O.ID_AREA,O.ID_OPERACAO,
                 AVG(P.DURACAO) TOTAL,
                 AVG(P.TRANSPORTE) TRANSPORTE,
                 AVG(P.LIMITE) LIMITE,
                 CASE WHEN COUNT(*) > 1 THEN COUNT(*) ELSE 0 END CICLOS,
                 SUM(CASE WHEN P.EXCEDIDO > 0 THEN 1 ELSE 0 END) EXCEDIDOS,
                 SUM(EXCEDIDO) MINUTOS

FROM OPERACOES O
LEFT OUTER JOIN PROCESSADOS P ON  (O.ID_OPERACAO = P.OPERACAO_ID) AND

   (O.ID_AREA = P.AREA_ID) AND

  ((P.INICIO >= '01/01/2007 00:00:00') AND

   (P.TERMINO <= '12/31/2007 23:59:59')) AND

    P.TURNO IN(1,2,3)
GROUP BY O.ID_AREA,O.ID_OPERACAO

Esta SP demora quase seis segundos para rodar sendo que a tabela PROCESSADOS
tem 100 mil registros, porém quando tem 1 milhão a demora multiplica por 10,
ou seja, demora quase 60 segundos p/ rodar, preciso fazer diferente:

Percebi que se eu tirar a consulta inicial na tabela Operacoes, que é feita
para poder mostrar todas as operacoes na lista mesmo que não haja
ocorrencias na tabela PROCESSADOS isso c/ LEFT OUTER JOIN, então e se eu
consultar separadamente um SELECT * FROM OPERACOES, e depois rodar outro SQL
diretamente na tabela PROCESSADOS, eu percebi que o SQL da PROCESSADAS
DIRETO, sem LEFT OUTER JOIN demora menos de MEIO SEGUNDO, então como posso
fazer para JUNTAR OS DOIS SQLS no FIREBIRD?

Gerando o sql original como resultado?

Obrigado!

Roger!



______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa

E-mail classificado pelo Identificador de Spam Inteligente Terra.
Para alterar a categoria classificada, visite
http://mail.terra.com.br/cgi-bin/imail.cgi?+_u=kdcc&_l=1,1200484333.88385.5529.buruma.hst.terra.com.br,5711,Des15,Des15






Mais detalhes sobre a lista de discussão lista