相关疑难解决方法(0)

为什么Contains()运算符会如此显着地降低Entity Framework的性能?

更新3:根据此公告,EF团队在EF6 alpha 2中已经解决了这个问题.

更新2:我已经创建了一个解决此问题的建议.要投票,请到这里.

考虑一个带有一个非常简单的表的SQL数据库.

CREATE TABLE Main (Id INT PRIMARY KEY)
Run Code Online (Sandbox Code Playgroud)

我用10,000条记录填充表格.

WITH Numbers AS
(
  SELECT 1 AS Id
  UNION ALL
  SELECT Id + 1 AS Id FROM Numbers WHERE Id <= 10000
)
INSERT Main (Id)
SELECT Id FROM Numbers
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)

我为表构建EF模型并在LINQPad中运行以下查询(我使用"C#语句"模式,因此LINQPad不会自动创建转储).

var rows = 
  Main
  .ToArray();
Run Code Online (Sandbox Code Playgroud)

执行时间约为0.07秒.现在我添加Contains运算符并重新运行查询.

var ids = Main.Select(a => a.Id).ToArray();
var rows = 
  Main
  .Where (a => ids.Contains(a.Id))
  .ToArray();
Run Code Online (Sandbox Code Playgroud)

这种情况的执行时间是20.14秒(慢288倍)!

起初我怀疑为查询发出的T-SQL需要更长的时间才能执行,因此我尝试将其从LINQPad的SQL窗格剪切并粘贴到SQL Server Management Studio中.

SET …
Run Code Online (Sandbox Code Playgroud)

c# sql performance contains entity-framework-4

79
推荐指数
5
解决办法
4万
查看次数

标签 统计

c# ×1

contains ×1

entity-framework-4 ×1

performance ×1

sql ×1