實體框架的 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中文網其他相關文章!