【发布时间】:2014-01-10 20:14:00
【问题描述】:
假设我的 SQL 数据库中有两个表。 1. 一个包含数千条记录的中型表,称为 MyTable1 2. 一个拥有数百万条记录(并且每天都在增长)的大表,名为 MyTable2
MyTable1 和 MyTable2 都有一个叫做 Hash 的属性,可以相等。
我正在寻找最有效的方法来使用 Linq to Entities 来遍历 MyTable1 并在 MyTable2 中找到所有具有相同哈希的记录并保存到另一个表中。这是代码外观的简化视图。
using(var db = new context()) {
var myTable1Records = db.MyTable1.Select(x => x);
foreach(var record in myTable1Records) {
var matches = db.MyTable2.Where(y => y.Hash.Equals(record.Hash)).Select(y => y);
foreach(var match in matches) {
// Add match to another table
}
}
}
我发现随着 MyTable2 的大小每天都在变大,这段代码的性能显着下降。我正在尝试有效处理此类场景的一些想法是:
- 在 db.MyTable2 上设置 MergeOption.NoTracking,因为它纯粹是一个读取操作。不幸的是,没有看到这方面的太大改善。
- 使用 .ToList() 将 MyTable2 拉入内存以消除对 db 的多次调用
- 创建代码可以迭代的 MyTable2 的“块”,因此它不会每次都查询完整的百万以上记录。
我很想看看您是否发现其他技术或灵丹妙药在这种情况下有效。谢谢!
【问题讨论】:
-
您在数据库中的哈希列上有索引吗?
-
您是否必须为 c# 带来数百万个值才能执行 RDMS 可以非常有效地执行的操作?
-
这可能有点偏离使用 Linq 的主题,但是如何在数据库中创建一个视图,其中这 2 个表基于
Hash字段连接,然后只查询连接的表? - 让您的数据库为您完成这部分的工作......这就是它经过优化后要做的事情!
标签: c# sql linq entity-framework