join absurdo

Este forum é dedicado a códigos errados que se encontram por aí, ou seja, coisas que não se deve fazer de jeito nenhum! Não coloque neste forum dúvidas! (apenas situações bizarras do nosso dia a dia :-)
Responder
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

olhem o parâmetro n_ped_nmro...

Selecionar tudo

SELECT /*+ all_rows */
 SUM(q.qtp_pars)
  FROM qtd_prg q
      ,ped p
      ,ite i
 WHERE p.ped_tipo IN ('PG', 'EX', 'PP')
   AND p.ped_nmro = n_ped_nmro
   AND q.ped_nmro = n_ped_nmro
   AND i.ped_nmro = n_ped_nmro
   AND i.ite_seqn = n_ite_seqn
   AND i.ite_seqn = q.ite_seqn
   AND q.qtp_pars > 0
 GROUP BY q.ped_nmro
         ,q.ite_seqn;

esse cara preferiu fazer 3 joins com o parâmetro do que simplesmente fazer entre os campos das tabelas eaiuehaiuehaiuehaiueha
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Taí um exemplo que eu já vi muito.
Mas não sei dizer se essa prática é BOA ou MÁ :-S

Teríamos que rodar o plano de execução das duas formas pra comparar... Vou ver se consigo simular isso aqui e posto os resultados.
Avatar do usuário
alef
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 119
Registrado em: Ter, 06 Nov 2007 2:45 pm
Localização: Patos de Minas - MG
Alexandre Matos
Patos de Minas - MG
Do interior de Minas para o resto do Mundo

Teóricamente não faz diferença, porque seria a mesma coisa que se ele fizer os joins entre as as tabelas, pois o valor das colunas ped_nmro nas tabelas assumem o mesmo valor. é claro que se o cara fosse usar outros metodos de joins com certeza iria fazer a diferença. me corijam se eu estiver enganado.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Ah sim, eu tb acho que nesse caso não faria diferença.
Minha dúvida é sobre o plano de execução que TALVEZ mude, pois oracle pode supor que os joins acabam retornando 1 linha no primeiro JOIN, talvez mais que uma no segundo, e muitas no terceiro... :-/

Já vi alguns casos (principalmente em bancos 8 ou 8i) que o otimizador as vezes viaja muito!
NaPraia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 88
Registrado em: Sex, 22 Fev 2008 8:24 am
Localização: Floripa - SC

não querendo discordar mas faz direfença sim se você compara um parâmetro ou um campo da tabela.
principalmente se a tabela estiver cheia que a consulta se torne pesada e o campo da tabela de dados e tiver índice.
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

ola...

(se levar em consideracao a tabela ped como de pedido e ite como de itens de pedido)

vejam se não estou enganado
vendo esta query a tabela "ped" possui uma restricao

Selecionar tudo

p.ped_tipo IN ('PG', 'EX', 'PP')
neste caso não poderia acontecer de trazer itens "ite" das quais seus pedidos não estao nessas condicoes, levando em consideracao que na query as mesmas não tem joins entre si??
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

cara...
eu posso estar completamente enganado, mas...
já que as duas tabelas recebem o mesmo valor para a variável n_ped_nmro...
é como se fosse uma join entre as tabelas...

exemplo:

Selecionar tudo

   p.ped_tipo IN ('PG', 'EX', 'PP') 
   AND p.ped_nmro = 101
   AND q.ped_nmro = 101
isso (^) seria igual a isso (V)...

Selecionar tudo

   p.ped_tipo IN ('PG', 'EX', 'PP') 
   AND p.ped_nmro = q.ped_nmro
   AND q.ped_nmro = 101
mas o que o NaPraia disse é bem provável que esteja certo... 8)
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes