Contient() d'Entity Framework : goulot d'étranglement des performances et solutions
L'utilisation de la méthode Contains()
d'Entity Framework avec IEnumerable
peut considérablement ralentir l'exécution des requêtes. En effet, cela se traduit par une grande série d'instructions OR inefficaces dans la requête SQL générée.
Comment Contains()
affecte les performances
Entity Framework ne prend pas en charge nativement la clause IN
de SQL. En conséquence, Contains()
est converti en plusieurs conditions OR. Plus il y a d’éléments dans IEnumerable
, plus la requête résultante devient volumineuse et lente. Bien que certains fournisseurs ADO.NET tentent d'optimiser, cela ne réussit pas toujours, en particulier avec des ensembles de données volumineux. Cela peut entraîner une dégradation significative des performances, comme l'illustre l'exemple montrant une augmentation du temps de requête de 0,07 seconde à 20,14 secondes après l'ajout de Contains()
.
Stratégies pour des performances améliorées
Plusieurs méthodes peuvent contribuer à améliorer les performances :
CompiledQuery
pour mettre en cache le plan d'exécution. Cependant, ce n'est pas une solution universelle et dépend du contexte de la requête.IN
directement en séparant la logique Contains()
en une requête distincte exécutée manuellement.IEnumerable
par lots plus petits, en exécutant plusieurs requêtes avec moins de conditions OU. Cela réduit la complexité de chaque requête individuelle.Futures améliorations
L'équipe Entity Framework est consciente de cette limitation et prévoit d'ajouter une prise en charge directe des clauses IN
dans les prochaines versions, éliminant ainsi le besoin de ces solutions de contournement.
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!