Les différences de performance entre les requêtes ERM et SQL brutes de Laravel sont significatives et découlent principalement de l'abstraction et du traitement des frais généraux en éloquent par rapport à l'exécution directe du SQL brut.
Performance Overhead in Eloquent Orm
Eloquent fournit une couche de mappage d'objet-relation qui traduit les enregistrements de la base de données en objets PHP. Cette abstraction ajoute la commodité et la lisibilité mais introduit plusieurs coûts de performance:
- Augmentation de l'utilisation du processeur et de la mémoire: éloquent instancie un objet pour chaque enregistrement de base de données récupéré ou manipulé, qui consomme plus de mémoire et de ressources CPU que SQL brut qui fonctionne directement sur les lignes de données sans conversion d'objet [3] [6].
- Temps d'exécution plus lents: En raison du traitement supplémentaire, les requêtes éloquentes prennent généralement plus de temps à exécuter. Ceci est particulièrement prononcé dans les opérations en vrac comme l'insertion ou la mise à jour de milliers d'enregistrements, où les frais généraux éloquents s'accumulent considérablement [3] [6].
- Génération de requêtes complexes: Pour les opérations impliquant plusieurs jointures de table, Eloquent génère souvent plusieurs requêtes SQL ou des requêtes complexes qui sont moins optimisées qu'une seule requête SQL brute bien conçue. Cela conduit à des temps d'exécution plus longs dans des opérations sélectionnées avec plusieurs jointures [3].
Avantages SQL bruts
Les requêtes SQL brutes contournent la couche ORM, en envoyant des commandes SQL directes à la base de données. Il en résulte:
- Exécution plus rapide: les requêtes SQL brutes s'exécutent plus rapidement car elles évitent la surcharge des couches de création et de traduction d'objets. Les tests de performances montrent que SQL brut surperformant éloquent dans les opérations d'insert, de mise à jour et de sélection, les différences de temps augmentant à mesure que le volume de données ou la complexité de requête augmente [3] [6].
- Mieux pour les opérations en vrac et complexes: le SQL brut est plus efficace pour les inserts / mises à jour en vrac et les requêtes complexes impliquant plusieurs jointures, car elle permet un contrôle précis sur la structure de la requête et l'optimisation [3] [6].
Quand utiliser chaque
- ORM éloquent: le mieux adapté aux applications de petite à moyenne taille avec des opérations CRUD relativement simples et des ensembles de données plus petits. Il améliore la productivité des développeurs, la lisibilité au code, la maintenabilité et les fonctionnalités de sécurité, ce qui le rend idéal lorsque les performances brutes ne sont pas critiques [3] [6].
- SQL brut: préféré pour les applications critiques de performance traitant de grands volumes de données, d'opérations en vrac ou de requêtes complexes où la vitesse d'exécution est primordiale. SQL brut fournit plus de contrôle et d'efficacité dans ces scénarios [3] [6].
Résumé
Bien que l'éloquent ORM offre des commodités de développement importantes, elle entraîne une pénalité de performance mesurable par rapport aux requêtes SQL brutes. La différence est le plus notable dans les opérations de données à grande échelle et les requêtes complexes. RAW SQL s'exécute plus rapidement et utilise moins de ressources mais nécessite plus de gestion manuelle des requêtes. Le choix entre eux dépend des exigences de performance de l'application et des priorités de développement [3] [6].
Citations:
[1] https://www.reddit.com/r/laravel/comments/hezv6m/elognent_vs_query_builder_vs_sql_performance_test/
[2] https://laravel.io/forum/04-23-2014-elognent-vs-raw-sql-which-is-rely-better
[3] https://www.diva-portal.org/smash/get/diva2:1014983/fulltext02
[4] https://stackoverflow.com/questions/14570568/speed-comparison-between-elognent-orm-query-builder-and--raw-sql-queries
[5] https://www.youtube.com/watch?v=n_rbsojfcau
[6] https://blog.livares.com/comparison-of-performance-between-elognent-and-raw-Query/
[7] https://dev.to/hesamrad/laravel-orm-vs-Query-builder-vs-sql-peed-test-4knf
[8] https://stackoverflow.com/questions/38391710/what-are-the-key-diffferences-between--laavels-elognent-ormand-and-query-builder