Maison > base de données > tutoriel mysql > Pourquoi NHibernate QueryOver avec Fetch provoque-t-il plusieurs requêtes de base de données et comment puis-je l'optimiser ?

Pourquoi NHibernate QueryOver avec Fetch provoque-t-il plusieurs requêtes de base de données et comment puis-je l'optimiser ?

DDD
Libérer: 2025-01-04 12:04:35
original
386 Les gens l'ont consulté

Why Does NHibernate QueryOver with Fetch Cause Multiple Database Queries, and How Can I Optimize It?

NHibernate QueryOver avec Fetch entraînant plusieurs exécutions de requêtes

L'exécution d'un QueryOver avec une clause Fetch pour récupérer une entité parent et sa collection enfant entraîne souvent dans des accès excessifs à la base de données. Ce comportement se produit car NHibernate émet une requête distincte pour chaque ligne de la collection enfant.

Pour comprendre cela, considérons un scénario avec une entité UserRole et une collection UsersInRole. La première requête récupère les entités UserRole :

SELECT ... FROM UserRoles
left outer join UsersInRoles on ...
Copier après la connexion

Pour chaque UserRole récupéré, NHibernate exécute ensuite une requête distincte pour récupérer la collection UsersInRole, ce qui donne lieu à de nombreuses requêtes au format :

SELECT ... FROM UsersInRoles
left outer join UserRoles on ...
WHERE UserRoles.UserId=?
Copier après la connexion

Pour optimiser ce comportement, NHibernate permet de définir une propriété BatchSize sur HasManyToMany mapping :

HasManyToMany(x => x.UsersInRole)
  ...
  .BatchSize(25)
Copier après la connexion

En spécifiant cette option, NHibernate chargera la collection enfant par lots, réduisant le nombre de requêtes de base de données à un maximum de 1 (taille du lot / taille de la page). Cela garantit une récupération efficace des données associées tout en évitant des accès excessifs à la base de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal