Le 2011-17-11 15h43, Marcelo Silva (IG) a écrit :
>
> select a.*, b.descricao, c.data_ven
> from mv_servicos_print a
> inner join mv_produtos b on(b.codigo = a.codigo)
>    and(b.imprime = 'S') -- *** Aqui ***
> inner join mv_servicos_balcao c on(c.cod_key = a.cod_key_balcao)
> where (a.controle = 26116)
>    and(a.obs not in('C'))

Por que há uma condição numa junção e outras na cláusula de seleção (WHERE)?

        Não deveria, que eu saiba, fazer diferença para o planejador de 
execução, mas o ideal é que todas as condições estejam organizadas na 
cláusula de seleção, por exemplo:

  SELECT
        s.*,
        p.descricao,
        b.data_ven
    FROM
        mv_servicos_print       s
   INNER JOIN
        mv_produtos             p
   USING codigo
   INNER JOIN
        mv_servicos_balcao      b
     ON (b.cod_key      =       s.cod_key_balcao)
  WHERE s.controle      = 26116
    AND s.obs           <> 'C'
    AND p.imprime       = TRUE
;

        Código compreensível é esclarecedor, e ajuda a todos entenderem e, 
talvez, ajudar.


> Acontece que se eu tirar a linha "and(b.imprime = 'S')"

E por que b.imprime não é BOOLEAN?

        Outra coisa, cod_key parece má modelagem… talvez valha a pena analisar 
se o uso de chaves naturais não poderia dispensar uma das junções.


> ele fica rapidinho, mas se deixa-la o SQL fica lento...

Teria de ter estrutura completa de todas as tabelas e índices 
envolvidos, e análise de plano de execução da consulta.


> Bem imagino que tenha a ver com o seguinte, esse campo eu inseri depois de a
> tabela já estar populada, a unica coisa diferente foi isso, mas eu tenho
> alterado outras tabelas e não tenho tido esse problema.

E…?

        Por favor, esse tipo de ‘análise’ — na verdade, especulação combinada a 
tentativas-e-erro — só confunde.  Tem-se de descobri o que realmente 
acontece na execução que levantou a questão.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a