Qual forma é mais eficiente?  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

Oi pessoal, se estou querendo fazer uma pesquisa para obter UMA tupla contendo a placa do carro e o nome do dono por exemplo. Devo pesquisar em uma tabela de cada vez ou faço o join?

(uma tabela por vez)
SELECT m.nome FROM motorista m WHERE m.cpf = ?;
SELECT v.placa FROM veiculo v WHERE v.cpf_dono = ?

(com join)
SELECT m.nome, v.placa FROM motorista m INNER JOIN veiculo v ON m.cpf = v.cpf_dono WHERE m.cpf = ?

Se o resultado fosse um conjunto relacionando as placas e os respectivos nomes dos proprietários, não há dúvida de que a segunda forma seria a ideal. Mas no meu caso, eu sei que a query só trará um único resultado, então neste caso, qual é a melhor forma?

This message was edited 1 time. Last update was at 03/11/2008 13:10:16


Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
marciocamurati
JavaEvangelist
[Avatar]

Membro desde: 29/05/2004 14:54:36
Mensagens: 322
Localização: São Paulo
Offline

Bom não existe nenhuma receita para query na verdade o ideal é sempre estudar/analisar caso a caso, depende muito de como foram gerados os indices se existem e etc.

Mas no chute imagino que o JOIN vá lhe dar uma resposta/performance melhor do que fazer duas queries em separado, mas só testando em algum analyzer da vida para você ter essa resposta principalmente que o que implica em performance é na verdade a longo prazo, quantidade de dados e etc.

[]s

This message was edited 1 time. Last update was at 03/11/2008 13:19:07


Marcio Camurati
[WWW] [MSN] [ICQ]
leo_mf
JavaChild
[Avatar]

Membro desde: 03/10/2008 09:59:50
Mensagens: 101
Localização: São Paulo - SP
Offline

Pode confiar, o join é bem melhor.

Tento gostar do Eclipse, mas ele só me decepciona.
[Email] [MSN]
fantomas
GUJ Master
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1528
Localização: Terra (maior parte do tempo)
Offline

marciocamurati wrote:Se o resultado fosse um conjunto relacionando as placas e os respectivos nomes dos proprietários, não há dúvida de que a segunda forma seria a ideal. Mas no meu caso, eu sei que a query só trará um único resultado, então neste caso, qual é a melhor forma?


Não sei se entendi direito, mas estou com o pessoal ai de cima, o join juntamente com uma boa formação de chaves, respectivos indices e outras particularidades de cada banco sempre vai lhe dar a melhor resposta principalmente neste seu caso; as duas tabelas parecem que estão relacionas pela coluna cpf (provavelmente é a chave primária) numa relação de 1:n então o join é o melhor caminho, vc obterá o resultado em um ÚNICO acesso.

flws
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

Bem, no meu caso eu tenho chaves primárias compostas (com a PK de uma tabela sendo parte da PK de outra tabela), um modelo que não é bem estruturado.

Já tenho uma pesquisa que faz 3 joins para trazer uma tupla. Daí eu precisava trazer mais um valor para o qual precisaria dar um outer join em mais duas tabelas (com inner join entre si), o que deixaria a SQL cada vez mais pesada e complicada com mais e mais joins em chaves compostas.

Neste caso, o que vocês acham que tende a ser melhor? Joins mesmos por mais complicada que a SQL fique?

Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
vinnyparker
JavaChild
[Avatar]

Membro desde: 08/07/2008 09:46:20
Mensagens: 124
Offline

rapaz eu prefirira usar com join
porem nao sou mto fan de usar o inner nao, pq ele faz a consulta demorar mais...
use o left join ... sempre uso dessa forma e fika td blz

http://www.evollux.net

Fedora 15

[Email] [WWW] [MSN]
ovelha
Java Ninja
[Avatar]

Membro desde: 12/09/2007 13:17:41
Mensagens: 281
Offline

Em um caso simples assim até parece facil não usar join, quero ver fazer isto em 5 tabelas sendo que todas tem um relacionamento 1 - *.

bééééééééééééééééé
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Rode explain nas duas e veja quantas linhas cada uma busca e quais índices elas usam

Não tem jeito mais fácil de se saber, quem usar menos linhas e os melhores índices vai ser a melhor opção.

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
vinnyparker
JavaChild
[Avatar]

Membro desde: 08/07/2008 09:46:20
Mensagens: 124
Offline

rapaz se vc tem 5 tabelas e todas com relacionamento usaq fica mara

http://www.evollux.net

Fedora 15

[Email] [WWW] [MSN]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team