47 votes

Stratégie de récupération Hibernate - quand utiliser "join" et quand utiliser "select"?

La plupart des associations Hibernate prennent en charge le paramètre "fetch":

 fetch="join|select"
 

"select" étant la valeur par défaut.

Comment décider lequel utiliser pour quelle association?

J'ai essayé de tout changer de «sélectionner» à «rejoindre» une large gamme d'applications - le nombre de requêtes générées a probablement diminué 10 fois, mais les performances sont restées exactement les mêmes (voire devenir un peu moins bonnes).

Merci.

41voto

Brian Deterling Points 7778

Rejoindre est censé résoudre le n+1 de problème. Si vous avez 10 parents, chacun avec 10 enfants, rejoignez nécessitera une requête et sélectionnez exigera 11 (l'une pour les parents et une pour les enfants de chaque parent). Cela peut ne pas être une grosse affaire si la base de données est sur le même serveur que l'application ou si le réseau est très rapide, mais si il y a une latence dans chaque base de données d'appel, il peut ajouter jusqu'à. La méthode join est un peu moins efficace sur la requête initiale parce que vous êtes en dupliquant le parent colonnes dans chaque ligne, mais vous ne faites que d'un aller-retour à la base de données.

En général, si je sais que je vais avoir besoin les enfants de tous les parents, je pars avec la rejoindre. Si je ne vais avoir besoin de les enfants de quelques parents, je sélectionner.

9voto

jdmichal Points 6283

Sélectionnez extraire les éléments enfants, par l'émission d'une nouvelle requête à la base de données pour eux. Rejoignez va chercher les éléments enfants par se joindre à eux dans le parent de la requête. C'est pourquoi vous voyez des performances similaires, même avec une chute du nombre de requêtes.

Sélectionnez:

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

Joindre:

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

Quand utiliser l'un sur l'autre... Pas ensemble bien sûr. Cela dépend probablement sur le système de base de données. Si l'on était toujours mieux que les autres, je doute qu'ils auraient pris la peine de vous donner la possibilité! Si vous voyez des performances similaires pour chacun d'eux, je ne serais pas s'inquiéter à ce sujet.

1voto

user528050 Points 62

fetching = "join" Si vous faites fetching = "join", il récupérera toutes les informations dans une seule instruction select.

fetching = "select" si vous voulez paas la deuxième instruction select pour récupérer la collection associée que dans ce cas, vous utiliserez fetch = "select".

source: Hibernate Fetching Strategies

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X