使用 LINQ 优化内存中慢查询列表以检索数据

Posted

技术标签:

【中文标题】使用 LINQ 优化内存中慢查询列表以检索数据【英文标题】:Optimize the slow query in-memory List using LINQ for retrieving data 【发布时间】:2021-06-14 07:10:55 【问题描述】:

我有一个无法优化的 LINQ 查询。运行大约需要 6 秒。

IList<Note> notes;
data = client.Configuration.Data.OfType<UWData>()
    .Where(s => s.ShouldDisplay)
    .OrderByDescending(s => s.Id)
    .ToList()
    .Select(n => (Note)n)
    .ToList();

client.Configuration.Data 包含数十万条数据(100,000 项)。 client.Configuration.Data 是一个缓存,我正在从缓存中检索数据。 client.Configuration.Data 包含 100,000 个项目,我们有 10 个项目是 UWData 的类型。我要选择10个UWData

var data = client.Configuration.Data.OfType<UWData>().ToList();
data = UWData
    .Where(s => s.ShouldDisplay)
    .OrderByDescending(s => s.Id)
    .ToList()
    .Select(n => (Note)n)
    .ToList();
            

上面的代码也需要类似的时间来加载。 有时加载大约需要 4 秒(正好是 3,356 毫秒)。 关于如何加快速度的任何想法?

【问题讨论】:

性能取决于使用的数据库类型和大小。您可能无法加快结果。用于连接数据库的驱动程序也会影响速度。您正在使用什么数据库以及哪个驱动程序?请参阅以下驱动程序列表:connectionstrings.com 如果您从缓存中检索数据,那么为什么要使用entity-framework 标签?删除标记并在问题中指定您正在运行 LINQ 内存查询(LINQ to Objects)。 请记住,我们大多数不住在印度的人都不知道什么是“十万数据”,他们充其量只能猜测是“缺乏数据”。所以请不要在这里使用印度词。 如果内存中有 10^5 个项目,您的问题可能不是发布的查询。线性,甚至n log n 复杂性,因为许多项目应该在几十到几百毫秒的数量级,而不是几秒钟。 使用分析器! 那么在显示的代码中没有什么可以优化的。罪魁祸首显然是在Data 缓存实现中。您使用完全不清楚的“缓存”、“加载”等术语(人们假设缓存是某种列表,但随后就不会有加载之类的东西),所以您真的需要找出是什么原因造成的性能问题以及如何/是否可以改进。 “缓存”实现中的所有内容,我们无能为力。 【参考方案1】:

当您使用某种 ORM 时,请记住留意 SQL 连接(您可以提取您的 ORM 生成的 SQL)作为最佳实践,最好只选择必要的列并使用索引

【讨论】:

以上是关于使用 LINQ 优化内存中慢查询列表以检索数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 EF6 优化 LINQ 查询

MySQL的简单优化

如何改进此 LINQ 查询以查找用户将列表中的所有技能

Linq 查询可以从 Sql 数据库中检索 BLOB 吗?

传递一个 Union Linq 查询以查看

优化多个 LINQ to Entity Framework 查询