实体框架的 Contains():大数据集的性能瓶颈
将实体框架的 Contains()
方法与大量数据集一起使用可能会严重影响性能。 这是因为它在生成的 SQL 中翻译成一系列 OR 语句,在处理大量比较时变得效率低下。
考虑这个例子:
<code class="language-csharp">var ids = Main.Select(a => a.Id).ToArray(); var rows = Main.Where(a => ids.Contains(a.Id)).ToArray();</code>
涉及 10,000 条记录的表和 100 个元素的数组的比较可能比检索所有行的简单 LINQ 查询慢最多 288 倍。 根本原因在于缺乏对 IN 表达式的本机 ADO.NET 支持。 EF 的解决方法(复杂的 OR 表达式树)对于大型输入集而言计算成本较高。
解决方案和策略
最佳方法是利用 In()
运算符,因为 ADO.NET 提供程序本身支持它,从而实现更高效的 SQL。
如果In()
不可行,请考虑以下替代方案:
CompiledQuery
需要基本数据类型。 要将其与数组或 IEnumerable
一起使用,请创建一个自定义函数,将输入转换为基本类型(例如,以逗号分隔的字符串)。然后可以在使用 CompiledQuery
运算符的 In()
中使用转换后的字符串。展望未来
实体框架团队意识到了这一性能限制,并正在探索提供程序模型中对 IN 表达式的本机支持。此增强功能将显着提高Contains()
大型数据集的性能。
以上是为什么实体框架的 Contains() 运算符在处理大型数据集时如此缓慢?的详细内容。更多信息请关注PHP中文网其他相关文章!