[pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Marcelo da Silva
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


Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Flavio Henrique Araque Gurgel

Em 05-07-2013 14:25, Marcelo da Silva escreveu:

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))


Depende do tamanho das tabelas, índices, distribuição de dados, etc.
EXPLAIN ANALYZE nelas e você saberá.

[]s

__
Flavio Henrique A. Gurgel
Líder de Projetos Especiais
Consultoria, Projetos  Treinamentos 4LINUX
Tel1: +55-11.2125-4747 ou 2125-4748
www.4linux.com.br
email: fla...@4linux.com.br
__
FREE SOFTWARE SOLUTIONS
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Claudio Bezerra Leopoldino
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


Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Marcelo da Silva
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


Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Flavio Henrique Araque Gurgel


Em 05-07-2013 14:54, Marcelo da Silva escreveu:

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


Não só o tempo foi menor como o custo total da consulta também foi (4279 
versus 9510).


Logo, fique com a opção B.
Note que suas tabelas têm poucas linhas, nenhum índice foi utilizado. 
Considere criar índice (se já não houver) na coluna cod_key da tabela 
mv_servicos_balcao. Todavia, dependendo da quantidade de resultados 
dessa tabela em relação ao tamanho total dela, pode ser que o índice 
nunca seja utilizado. Crie-o (se já não houver) e teste novamente.


[]s

__
Flavio Henrique A. Gurgel
Líder de Projetos Especiais
Consultoria, Projetos  Treinamentos 4LINUX
Tel1: +55-11.2125-4747 ou 2125-4748
www.4linux.com.br
email: fla...@4linux.com.br
__
FREE SOFTWARE SOLUTIONS
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Matheus de Oliveira
2013/7/5 Marcelo da Silva marc...@ig.com.br

 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


Possível. Mas para termos mais certeza, faça o seguinte:

VACUUM ANALYZE  mv_servicos_balcao;
VACUUM ANALYZE mv_servicos_print;

Em seguida, rode novamente as queries, mas ao invés de apenas explain use:

EXPLAIN (ANALYZE, BUFFERS) SELECT ... ;

E rode pelo menos duas vezes cada para evitar efeitos de cache (o ideal
seria executar um restart, mas 2 execuções deve dar um bom retorno).


Mito detonado ? rsrsrs


Qual o mito afinal?

xD


Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Claudio Bezerra Leopoldino

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


Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Bruno Silva
2013/7/5 Claudio Bezerra Leopoldino claudiob...@yahoo.com.br

 EXPLAIN  SELECT A.CAMPOS FROM TABEL_A A

 WHERE (A.CODIGO NOT IN(SELECT CODIGO FROM TABELA_B))


Trocaria o NOT IN port NOT EXISTS

Bruno E. A. Silva.
Analista de Sistemas.
Bacharel em Sistemas de Informação
Pós-graduando em Gerência de Projetos
Certified Scrum Master
LPIC-1
SCJP, SE 6
Novell CLA / DCTS ECR
DBA Postgres
---
“A caixa dizia: Requer MS Windows ou superior. Então instalei Linux.” -
Sábio Desconhecido
Alguns prestam serviço/consultoria de Qualidade, os outros vendem licença!
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN

2013-07-05 Por tôpico Marcelo da Silva
O NOT IN ainda está sendo o mais eficiente




Em 5 de julho de 2013 16:07, Bruno Silva bemanuel...@gmail.com escreveu:


 2013/7/5 Claudio Bezerra Leopoldino claudiob...@yahoo.com.br

 EXPLAIN  SELECT A.CAMPOS FROM TABEL_A A

 WHERE (A.CODIGO NOT IN(SELECT CODIGO FROM TABELA_B))


 Trocaria o NOT IN port NOT EXISTS

 Bruno E. A. Silva.
 Analista de Sistemas.
 Bacharel em Sistemas de Informação
 Pós-graduando em Gerência de Projetos
 Certified Scrum Master
 LPIC-1
 SCJP, SE 6
 Novell CLA / DCTS ECR
 DBA Postgres
 ---
 “A caixa dizia: Requer MS Windows ou superior. Então instalei Linux.” -
 Sábio Desconhecido
 Alguns prestam serviço/consultoria de Qualidade, os outros vendem
 licença!

 ___
 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