Hibernate estratégia de busca - quando usar “join” e quando usar “selecione”?

StackOverflow https://stackoverflow.com/questions/617145

  •  03-07-2019
  •  | 
  •  

Pergunta

A maioria associações Hibernate apoiar "fetch" parâmetro:

fetch="join|select"

com "selecione" sendo o valor padrão.

Como decidir qual usar para o qual associação?

Eu tentei mudar tudo a partir de "selecionar" para "juntar-se" a aplicação larga - número de consultas gerados diminuiu provavelmente 10 vezes, mas o desempenho ficou exatamente a mesma (até mesmo se tornar um pouco pior).

Graças.

Foi útil?

Solução

Adira é suposto para resolver o problema n + 1. Se você tem 10 pais, cada um com 10 crianças, junte-se exigirá uma consulta e selecione exigirá 11 (um para os pais e outro para os filhos de cada um dos pais). Isto pode não ser um grande negócio se o banco de dados estiver no mesmo servidor como o aplicativo ou se a rede é muito rápido, mas se houver latência em cada chamada de banco de dados, ele pode somar. O método de junção é um pouco menos eficiente na consulta inicial, porque você está duplicando as colunas pais em cada linha, mas você só fazer uma ida e volta para o banco de dados.

Geralmente, se eu sei que vou precisar os filhos de todos os pais, eu vou com aderir. Se eu só vou precisar os filhos de alguns pais, eu uso selecionar.

Outras dicas

Selecionar vai buscar itens filhos através da emissão de uma nova consulta ao banco de dados para eles. Junte vai buscar itens filhos, unindo-os em consulta dos pais. Então é por isso que você está vendo um desempenho semelhante, mesmo com uma queda no número de consultas.

Selecionar:

SELECT * FROM parent WHERE id=(whatever)
SELECT * FROM child WHERE id=(parent.child.id)

Junte-se a:

SELECT *
FROM parent
LEFT OUTER JOIN child ON parent.child.id=child.id
WHERE parent.id=(whatever)

Quanto ao momento de usar um sobre o outro ... Não toda certeza. Ele provavelmente depende do sistema de banco de dados. Se um era sempre melhor do que a outra, duvido que daria ao trabalho de dar-lhe a opção! Se você está vendo um desempenho semelhante para cada um, eu não me preocuparia com isso.

Se o pai tem muitos filhos e as crianças, por sua vez têm muitos outros, então neste caso a inicial 'juntar' pode sufocar a rede. Minha sugestão é usar 'selecionar', neste caso, para dividir os seleciona.

buscar = "join" Se você buscar = "join" que vai retrive todas as informações em uma única instrução SELECT.

buscar = "select" se você quiser paas a segunda instrução de seleção para buscar a coleção associada que, nesse caso, você vai usar fetch = "select".

Fonte: Hibernate Buscando Estratégias

JOIN é preferido, normalmente, por motivos de desempenho.

A única razão para usar SELECT estiver Se você é resultados de paginação (Definição de um e um limite de compensação), que têm um relacionamento muitos-para-muitos. Se você usar JOIN, a entidade raiz vai aparecer várias vezes se ele contém vários muitos-para-muitos filhos e aquelas "cópias" contam contra o limite (mesmo se Hibernate cai-los após o fato usando DISTINCT_ROOT_ENTITY).

As pessoas estão sempre falar sobre o desempenho atingido utilizando fetch = Junte-se . Mas como eu acho, é importante para nós entender o número de pais registros / criança que está buscando:

Se você deseja buscar registro pai único single e esperando que ele não tem muitas crianças, então eu sugiro que você use fetch = SELECT .

Se você quiser obter todos os registros pai incluindo seus filhos, então seria melhor ir para fetch = Junte-se

Só para acrescentar uma nota que, se os registros forem busca lazy crianças ( lazy = true ), então seria não fazer qualquer sentido usando fetch = Junte-se desde os todos os registros pai e filho é carregado em um único tiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top