Marcelo, a diferença de custos entre as duas opções não é tão significativa.
Os planos de execução mostram que você está fazendo sequential scans. Neste
caso, aconselho que tente indexar as colunas utilizadas nas junções e teste se
há melhoria na sua consulta e depois disso peço que repita o teste do explain.
Cordialmente,
Cláudio Leopoldino
postgresqlbr.blogspot.com/
=================================================
________________________________
De: Marcelo da Silva <marc...@ig.com.br>
Para: Claudio Bezerra Leopoldino <claudiob...@yahoo.com.br>; Comunidade
PostgreSQL Brasileira <pgbr-geral@listas.postgresql.org.br>
Enviadas: Sexta-feira, 5 de Julho de 2013 14:54
Assunto: Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN
Tempo os seguintes resultados:
OPCAO A
explain select a.* from mv_servicos_balcao a
left join mv_servicos_print b on(cod_key_balcao = a.cod_key)
where (b.cod_key is null)
and(a.obs not in('C'));
"Hash Right Join (cost=9510.11..17269.55 rows=1 width=136)"
" Hash Cond: (b.cod_key_balcao = a.cod_key)"
" Filter: (b.cod_key IS NULL)"
" -> Seq Scan on mv_servicos_print b (cost=0.00..3746.55 rows=213355
width=8)"
" -> Hash (cost=7913.20..7913.20 rows=127753 width=136)"
" -> Seq Scan on mv_servicos_balcao a (cost=0.00..7913.20 rows=127753
width=136)"
" Filter: (obs <> 'C'::bpchar)"
OPCAO B
explain select a.* from mv_servicos_balcao a
where (a.obs not in('C'))
and(a.cod_key not in(select cod_key_balcao from mv_servicos_print))
"Seq Scan on mv_servicos_balcao a (cost=4279.94..12516.98 rows=63876
width=136)"
" Filter: ((obs <> 'C'::bpchar) AND (NOT (hashed SubPlan 1)))"
" SubPlan 1"
" -> Seq Scan on mv_servicos_print (cost=0.00..3746.55 rows=213355
width=4)"
Vou ser sincero... não sei fazer a leitura do explain, mas pelo que vi a
segunda opção se mostrou mais eficiente, haja visto que sem o explain temos os
seguintes valores em ms(milisegundos)
OPCAO A = 571 rows e 496ms
OPCAO B = 571 rows e 300ms
Mito detonado ? rsrsrs
Em 5 de julho de 2013 14:31, Claudio Bezerra Leopoldino
<claudiob...@yahoo.com.br> escreveu:
Não depende apenas da consulta. Depende dos dados armazenados e estatísticas no
seu servidor.
>
>Peço que use explain e noso envie o reultado:
>
>
>EXPLAIN SELECT A.CAMPOS FROM TABELA_A A
>LEFT JOIN TABELA_B B ON(B.CODIGO = A.CODIGO)
>WHERE (B.CAMPO IS NULL)
>
>
>e
>
>
>EXPLAIN SELECT A.CAMPOS FROM TABEL_A A
>
>
>WHERE (A.CODIGO NOT IN(SELECT CODIGO FROM TABELA_B))
>
>
>Cordialmente,
>
>
>Cláudio Leopoldino
>postgresqlbr.blogspot.com/
>=================================================
>
>
>________________________________
> De: Marcelo da Silva <marc...@ig.com.br>
>Para: Comunidade PostgreSQL Brasileira <pgbr-geral@listas.postgresql.org.br>
>Enviadas: Sexta-feira, 5 de Julho de 2013 14:25
>Assunto: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN
>
>
>
>Qual seria o mais eficiente ?
>
>
>SELECT A.CAMPOS FROM TABELA_A A
>LEFT JOIN TABELA_B B ON(B.CODIGO = A.CODIGO)
>WHERE (B.CAMPO IS NULL)
>
>
>ou
>
>
>SELECT A.CAMPOS FROM TABEL_A A
>
>WHERE (A.CODIGO NOT IN(SELECT CODIGO FROM TABELA_B))
>
>
>
>--
>
>Marcelo Silva
>----------------------------------------------------------------
>Desenvolvedor Delphi / PHP
>My Postgres database
>Cel.: (11) 99693-4251
>
>_______________________________________________
>pgbr-geral mailing list
>pgbr-geral@listas.postgresql.org.br
>https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
>_______________________________________________
>pgbr-geral mailing list
>pgbr-geral@listas.postgresql.org.br
>https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
--
Marcelo Silva
----------------------------------------------------------------
Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral