[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
Re: [pgbr-geral] Duvida básica LEFT JOIN x NOT IN
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
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
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
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/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
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/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
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