【问题标题】:Optimize the slow query in-memory List using LINQ for retrieving data使用 LINQ 优化内存中慢查询列表以检索数据
【发布时间】: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 缓存实现中。您使用完全不清楚的“缓存”、“加载”等术语(人们假设缓存是某种列表,但随后就不会有加载之类的东西),所以您真的需要找出是什么原因造成的性能问题以及如何/是否可以改进。 “缓存”实现中的所有内容,我们无能为力。

标签: c# performance linq linq-to-objects


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多