Contains()
Problèmes de performances d'Entity Framework
Entity Framework Contains()
est connue pour ses goulots d'étranglement en termes de performances. Cela vient de sa traduction en une série d'instructions OR au lieu d'une clause IN plus efficace dans la requête de base de données. Par exemple, Contains({1, 2, 3, 4})
se traduit par une expression complexe comme ((1 = @i) OR (2 = @i)) OR ((3 = @i) OR (4 = @i))
, que de nombreux systèmes de bases de données gèrent mal. Cette inefficacité est encore aggravée par le risque de problèmes d'équilibrage des arbres et de débordements de pile lors de la génération des requêtes.
Plusieurs stratégies peuvent améliorer les performances :
1. Chunking ID : Décomposez les grandes listes d'entrée en morceaux plus petits. Traitez chaque morceau avec une requête distincte. Cela réduit la complexité du SQL généré, mais nécessite une gestion minutieuse des doublons potentiels dans les données d'entrée.
2. Méthode segmentée personnalisée : Développez une méthode personnalisée qui accepte un paramètre de taille de bloc. Cela offre un meilleur contrôle et une plus grande adaptabilité aux différentes caractéristiques de performances des bases de données.
3. Requêtes compilées : Utilisez CompiledQuery pour précompiler la requête. Cela isole la phase de génération de requêtes, permettant ainsi de déterminer si le ralentissement provient de la création de requêtes ou de la récupération de données. N'oubliez cependant pas que CompiledQuery présente des limites, notamment son incompatibilité avec les paramètres array ou IEnumerable
directement.
4. Futures améliorations d'EF : L'équipe Entity Framework est consciente de cette limitation et prévoit de prendre directement en charge la clause IN dans les futures versions, améliorant ainsi considérablement les Contains()
performances.
Cet article explore la cause première de la dégradation des performances associée à l'opérateur Contains()
d'Entity Framework et propose des solutions pratiques pour atténuer ce problème courant.
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!