[firebase-br] Select com performance ruim

Paulo Portella pportellaa.firebase em gmail.com
Sáb Jun 11 23:19:42 -03 2011


minha sugestão :

1o.) no uso de DISTINCT no SELECT inicial
2o.) no uso de LEFT JOIN ou RIGTH JOIN na "posicao" certa das tabelas
3o.) mudar

select
..
..
..

   from MOVIMENTACAO M
   join ITEMMOVIMENTACAOPRODUTO I on
        (M.CODIGO = I.COD_MOVIMENTACAO and M.TIPO = I.TIPOMOVIMENTACAO)

PARA :

select DISTINCT
..
..
..

   from ITEMMOVIMENTACAOPRODUTO I
   left outer join MOVIMENTACAO M on
        (M.CODIGO = I.COD_MOVIMENTACAO and M.TIPO = I.TIPOMOVIMENTACAO)



Vida de americano é assim: iPhone, iPod, iPad, iMac….
Já a de brasileiro é assim:IPTU, IPVA, ICMS, IPI etc


Em 11/06/2011 19:48, Humberto S. Reis escreveu:
> Pessoal, boa noite,
>
> Tenho o select abaixo que retorna somente 6 registro, mas varre a tabela
> MOVIMENTACAO e lê mais de 66.000 registros, quando deveria ler os 6
> registros correspondentes (ITEMMOVIMENTACAOPRODUTO e filha da tabela
> MOVIMENTACAO). Como resolver isso, sem duplicar campos, já que o filtro é
> pelo status da MOVIMENTACAO  e datamovimentacao, também da tabea
> MOVIMENTACAO?
>
> select I.RDB$DB_KEY, I.COD_UNIDADE, I.VALORUNITARIO, I.QUANTIDADE,
>         I.ALIQUOTAIPI, I.BASEICMSSUBSTITUIDO, I.ALIQUOTAICMS, I.CODIGO,
>         I.COD_MOVIMENTACAO, I.TIPOMOVIMENTACAO, M.COD_REQUISITANTE,
>         M.COD_CEDENTE, M.VALORIPI, M.DATAMOVIMENTACAO, I.VALORRATEIO,
>         M.TOTAL_CONHECIMENTO, M.TIPOFRETE,M.VALORFRETEEXTRA, M.VALORDAE,
>         M.COD_TIPOMOVIMENTACAO, M.COD_TIPODOCUMENTO, M.BDI,
>         I.VALORICMSSUBSTITUIDO, M.TOTAL, I.VALORITEM,
>         (I.VALORRATEIO_FRETE + I.VALORRATEIO_SEGURO + I.VALORRATEIO_OUTRO),
>         I.BASEICMS, M.VALOR_DESC_FINANCEIRO
>    from MOVIMENTACAO M
>    join ITEMMOVIMENTACAOPRODUTO I on
>         (M.CODIGO = I.COD_MOVIMENTACAO and M.TIPO = I.TIPOMOVIMENTACAO)
>   where (M.STATUS = 'F') and
>         (M.DATAMOVIMENTACAO between '01/01/1900' and current_date) and
>         (((M.COD_CEDENTE = 'L000001') and (M.TIPO = 'S')) or
>         ((M.COD_REQUISITANTE = 'L000001') and (M.TIPO = 'E'))) and
>         (I.COD_PRODUTO = '00000402')
>   order by I.COD_PRODUTO,M.DATAMOVIMENTACAO, M.CODIGO, M.TIPO, I.CODIGO
>
> Ps. Não uso FK, faço o controle de integridade via trigger´s.
>




Mais detalhes sobre a lista de discussão lista