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
DDDoriginal
2025-01-04 12:04:35389parcourir

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 ...

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=?

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

HasManyToMany(x => x.UsersInRole)
  ...
  .BatchSize(25)

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:
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