使用 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 优化内存中慢查询列表以检索数据的主要内容,如果未能解决你的问题,请参考以下文章