JOIN FETCH peut être plus lent que N+1 : un benchmark Doctrine reproductible (+ agrégation JSON à 1 ligne par entité)

DEV - 18/12
Si vous avez déjà construit une « fiche produit » dans Symfony/Doctrine avec plusieurs relations (catégorie,...

Si vous avez déjà construit une « liste de produits » dans Symfony/Doctrine avec plusieurs relations (catégorie, marque, images, avis, décomptes…), vous avez probablement rencontré l'une de celles-ci :

  • classique N+1
  • Les collections « EAGER » déclenchent toujours des requêtes supplémentaires
  • coût élevé d'hydratation de l'entité
  • ou JOIN FETCH qui ressemble à « 2 requêtes » mais devient plus lent en pratique

Cet article concerne les points de terminaison de style DTO (tableaux/réponses API) à forte lecture, pour lesquels vous souhaitez :

  • nombre de requêtes prévisible
  • durée d'exécution prévisible
  • mise à l'échelle stable lorsque plusieursUn à plusieursles relations sont impliquées

Ce n’est pas un remplacement de Doctrine – c’est une trappe de sortie explicite de modèle de lecture.

Le vrai problème : plusieurs OneToMany JOIN explosent les lignes

REJOINDRE plusieursUn à plusieursrelations multiplie le jeu de résultats SQL (produit cartésien).

Exemple:

  • 3 images × 5 avis = 15 lignes par produit
  • pour 2000 produits => ~30 000 lignes transférées depuis la base de données et traitées

La carte d'identité de Doctrine masque les doublons en PHP, mais la base d...
[Courte citation de 8% de l'article original]

Loading...