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

Roger pikurim em hotmail.com
Qua Jan 16 11:46:15 -03 2008


Cara tem algum exemplo ai usando FOR? eu nunca usei!
Valeu.

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

É por que mesmo quando não é encontrado registro correspondente na tabela 
processados aparece 1 e nesse
caso deve aparecer null também.

Roger.



"Kleber Caneva" <kdcc em terra.com.br> escreveu na 
notícia da mensagem:097501c85846$c3a5b0f0$8603a8c0 em motocana.com...
> 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 *
>

>
> []´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
>
>
>
> ______________________________________________
> 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
> 





Mais detalhes sobre a lista de discussão lista