我希望使用最新的登录时间从数据库中获取不同的用户。我的代码有效但芬兰需要20多秒。我可以优化我的代码吗?
var usersFromDb = _Context.Users
.OrderByDescending(u => u.Time)
.DistinctBy(u => u.ID).ToList();
型号:
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public int Client { get; set; }
public DateTime Time { get; set; }
}
此表有100k记录
答案 0 :(得分:1)
除非我遗漏了某些内容,否则用户应该已经拥有唯一的ID,因此不同的内容是多余的。
我希望SQL优化器知道如果它是Clustered Index,但你可以尝试删除它。
您需要退回所有用户吗?你在使用延迟加载吗?您可能也在撤回客户端数据,因此可能需要检查SQL Server分析器以查看发生的情况。
您也可以返回所需的字段:
var usersFromDb = _Context.Users
.Select(u => new MyUser
{
Id = u.ID,
Name = u.Name,
Time = u.Time
}).
.OrderByDescending(u => u.Time)
.ToList();
答案 1 :(得分:0)
您应该为Time
字段添加非聚集索引以优化OrderBy操作。例如,您可以像这样更改模型
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public int Client { get; set; }
[Index]
public DateTime Time { get; set; }
}
然后将迁移应用到DB。另外,您可以在不更改EF模型的情况下在数据库中创建索引,只需执行下一个sql查询
CREATE INDEX IDX_Time ON Users (Time);
在排序列上定义索引可以改善性能结果。
由于ID
不是主键,您应该从两列创建覆盖索引以最大化性能查询
CREATE INDEX IDX_Time ON Users (Time, ID);