实体框架延迟加载性能

时间:2016-06-22 05:52:36

标签: entity-framework

我需要收集用户的最后100条消息 我已经向数据库生成了100万条消息 有人可以向我解释为什么这需要~7000ms

var user = db.Users.FirstOrDefault(x => x.ID == userid);
var messages = user.Messages.OrderByDescending(x => x.ID).Take(100);

虽然这个速度快〜1ms

var messages = db.Messages.Where(x => x.UserID == userid).OrderByDescending(x => x.ID).Take(100);

2 个答案:

答案 0 :(得分:0)

使用Take()不会影响数据库引擎的工作负载 - 数据库引擎会选择匹配查询的所有记录,然后返回前100个(我认为SQL Server 2014可能已经改进了引擎只选择所需的记录)。

因此,第一个查询实际上是强制db引擎在筛选前100个之前选择所有记录。

答案 1 :(得分:0)

我将在此方案中使用的最佳方法是使用存储过程。

由于表中似乎有大量数据,因此在某些时候 LINQ 会失去其性能。将选择逻辑转移到DBMS是一种很好的方法。

SQL SERVER将存储过程结果作为编译的查询集保存在自己的缓存中。所以执行肯定会很快。

尝试创建具有以下查询的新存储过程

SELECT TOP 100 [Your Column Names] FROM [TABLENAME] ORDER BY UserID  DESC

将存储过程添加到实体模型中然后导入函数并检查您的数据获取性能是否会得到改善。

希望有助于此。 :)