Sous-sélection Hibernate vs récupération par lots
Hibernate fournit (au moins) deux options pour se déplacer le N+1 de la requête problème. L'un est le réglage de la FetchMode de sous-sélection, ce qui génère un select avec une clause et une sous-sélection au sein de cette clause. L'autre est de spécifier un BatchSize, ce qui génère un select avec une clause contenant les parents Id.
À la fois le travail, mais je trouve que la sous-sélection de l'option s'exécute souvent dans des problèmes de performance en raison de la requête pour les parents d'être complexe. D'autre part, avec un grand BatchSize (disons 1000), le nombre de requêtes et de la complexité de ces requêtes sont très petites.
Ma question est donc: quand souhaitez-vous utiliser Hibernate sous-sélection FetchMode sur BatchSize? Sélectionner probablement de sens que si vous avez un très grand nombre de parents d'entrées (en milliers), mais existe-il d'autres scénarios où vous préférez une sous-sélection de BatchSize?
EDIT: j'ai remarqué une différence entre les deux lorsque vous traitez avec impatient de chargement. Si vous avez un xToMany association ensemble à être chargé avec impatience et par une sous-sélection, il génère une sous-sélection, comme il le ferait s'il était paresseux. Si vous spécifiez un BatchSize toutefois, la requête générée permet d'utiliser une jointure externe à la place d'une autre requête. Est-il un moyen de forcer à Hibernate d'utiliser une autre par lot de requête lors du chargement avec impatience?
source d'informationauteur Zecrates
Vous devez vous connecter pour publier un commentaire.
Je n'utilise pas de sous-sélection, car il est difficile à contrôler. Dans un très grand système de logique métier complexe et une grande équipe de travail sur lui, il est trop difficile de dire quelles sont les requêtes utilisées. Sous-sélection peuvent travailler dans des cas spécifiques où vous savez exactement qui la requête est exécutée.
Le chargement par lot a quelques grands avantages. Il n'est pas toujours le plus rapide, mais généralement assez rapide. D'autre part, il est très stable, ne pas avoir d'effets secondaires et est complètement transparent pour la logique métier. Je n'ai jamais utiliser le traitement par lots des valeurs supérieures à 100. Il suffit de réduire la N+1 certaine quantité raisonnable de requêtes.
J'ai trouvé cet article pour être utile. Je crois chargement par lot peut être appliquée à la fois sur la collecte et le parent, alors que les sous-sélection ne peut être appliqué sur une collection.
Dans le cas d'une extraction de la stratégie pour les collections, une sous-sélection sera exécutée une fois (parce que le batch-size est effectivement infini), alors qu'avec le chargement par lot l'instruction SQL peut être exécutée plusieurs fois.