如何以最佳性能明智地将右表中的列加入左列表

Posted

技术标签:

【中文标题】如何以最佳性能明智地将右表中的列加入左列表【英文标题】:How to best performance wise join a column from right table into left list 【发布时间】:2021-11-17 00:22:00 【问题描述】:

accountAging 并且我正在尝试将属于 accountNotes 数据库表中的 accountId 的注释添加到 accountsAging 列表的 AccountNotes 字段中。我首先尝试了这种方法:

            foreach (var account in accountAging)
            
                account.AccountsReceivableNotes = accountNotesList.Where(n => n.AccountId == account.AccountId).Select(n => n.Content).FirstOrDefault();

但出于性能原因,我想避免循环,因为我有很多数据。

一篇文章建议进行连接以获得更好的性能。所以我在下面尝试了这个。但是,我想知道是否有一种简单的方法可以分配 accountAging 中的所有字段而不指定每个字段。有超过 15 个以上的字段。下面的这种方法会清除 AccountAging 中其他字段中的所有值,只给我 AccountNotes。循环当然有效,但试图优化代码。谢谢。

 var c = from a in accountAging
                    join n in accountNotesRepository.All.AsEnumerable()
                    on a.AccountId equals n.AccountId
                    select new AccountAging
                    
                      AccountNotes = n.Content 
                    ;

【问题讨论】:

【参考方案1】:

加快代码速度的一种解决方案是构建哈希图。哈希映射的键是account.AccountId,对于accountNotesList 中的所有account,值是account。生成的代码可以像使用 foreach 一样遍历 accountAging 中的帐户,但是由 linkq 执行的慢速线性遍历可以替换为恒定时间的哈希映射访问。如果accountNotesList 不明显大于accountAging,这也应该比linkq 连接更快。请注意,与经过精心优化的循环相比,linkq 往往非常慢。

【讨论】:

谢谢杰罗姆。我确实尝试了哈希映射,它有所帮助。

以上是关于如何以最佳性能明智地将右表中的列加入左列表的主要内容,如果未能解决你的问题,请参考以下文章

7-10外连接查询

如何加入同一表中的列

当没有明确的列可以加入时,如何使用另一个表中的值更新 sql 表?

Ram 或 DB 表中的表,以获得最佳性能

如何从左表中仅获取一条记录与右表中的每条记录

如何编写 BigQuery/SQL 查询以将一个表中的列的平均值与第二个/另一个表中的列相除