我使用。orderbydescent (x => x.d id)从大型数据集到web应用程序返回页集20中的最新数据。我一直在尝试优化查询的速度,并注意到当我删除orderbydescent()调用时,它将查询时间从大约8或9秒降低到2秒。我假设使用orderbydescent()的查询从第一个条目(最低的ID号)开始,并在返回最后20个左右的结果之前循环遍历所有数据。如果是这样的话,无论如何要使我的查询从最后一个条目(最高的ID号)开始,并工作到最低的方式?
关于我正在使用MS SQL Server和下面的LINQ查询的一些问题,我正在尝试优化
TransactionDao.GetAll()
.Where(x => x.Order.Location.Id == locationId && x.Status == Status.Complete)
.OrderByDescending(x => x.Id)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize).ToList();
我将假设数据源是SQL server,但如果不是,请相应地更新。如果是SQL server,下面是我用来调优LINQ语句的过程。
- 使用SQL Management Studio -> Tools -> Profiler启动SQL Profiler 为简单起见,选择默认选项
- 运行应用程序
- 在linq语句运行前设置一个断点
- 当断点被击中时,切换到分析器并使用橡皮擦清除以前的所有查询。
- 运行linq语句
- 查找实际执行的SQL语句
- 复制到管理工作室
- Select Query -> Include实际执行计划
- 执行查询并查看执行计划。查看它正在做什么,看看是否有任何索引建议
可选在数据库引擎调优分析器中选择Query -> analyze Query,可以提供额外的索引建议。
我看到很多开发人员做的一件事是在数据层中的选择之前执行and . tolist()或to EntityCollection()。这违背了目的,因为一旦这样做了,就会在数据库上执行查询,并且在内存中执行任何后续的过滤器或顺序。最好让数据层返回IQueryable,以便在数据库上执行筛选。
希望这能给你足够的信息来找到你的问题的答案
我认为这取决于索引,你可以尝试索引你的id和相关列。接下来,您可以尝试通过sql查询执行。或者你可以在查询之前使用list(),这样速度会慢一些。
可以张贴整个Linq查询吗?
从你的问题中,我假设你不使用LingToSql
,只是处理从SQL返回的数据。最好的选择当然是只返回最后几行到应用程序中,如果可能的话。
c#中的基本集合没有索引,所以如果你想按顺序从列表中取出最后几行,你必须对所有记录进行排序,否则你不知道哪些是最后的