Entity Framework et Select N+1

Nous utilisons Entity Framework dans le nouveau produit de la société. Par défaut, celui-ci est configuré pour utiliser le Lazy Loading.

Cela est certes très pratique pour développer rapidement des affichages MVC mais on peut très rapidement se retrouver avec des problèmes de Select N+1 et donc, de sérieux défauts de performances…

aspnet

Les problèmes de Select N+1 se produisent quand on veut lire une collection d’entités appartenant à un objet que l’on vient de « requêter ».

Entity Framework est un ORM très puissant qui permet un développement de la couche d’accès aux données très poussé. Seulement cette puissance relative s’exprime aussi négativement, dans le cas du Lazy Loading.

Lorsque nous essayons de parcourir une collection d’objets de notre objet, Entity Framework va tenter de la charger à partir de la base de données, et ce, en effectuant une requête « for each » objet… c’est ce qu’on appelle la sélection N+1:

Au lieu d’une requête, on en effectue N+1

profile_picture_by_nyan_cat_over9000-d5qrkgs

Quelles sont les solutions possibles?

On peut désactiver simplement le Lazy Loading en modifiant le paramétrage d’EF.

Suite à cette action, deux possibilités s’offrent à nous: utiliser l’Eager Loading qui consiste à charger les entités filles en même temps que l’entité parente (méthode Include) ou l’Explicit Loading qui consiste à appeler explicitement les entités filles dont on a besoin.

L’Eager Loading est bien entendu la solution la plus simple à mettre en oeuvre. Cependant, cette simplicité de mise en place est à pondérer avec les problèmes de performance qui pourraient subvenir en cas d’Include massif dans le chargement d’une entité parente.

Advertisements

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s