我如何快速比较 table 列,2 tables
How can i compare table colums in a fast way, 2 tables
我有 2 个表,我想知道有多少标记为 IsCkecked=true 的记录在表 2 中没有数据。
然后我需要将它们标记为 false 以便它们得到第二次处理。
第二个程序正在处理所有 Table1 记录并将数据保存到 Table2。
表 1 90.000 条记录
-ID
-IsChecked
-其他数据
Table2 60.000 条记录
-ID
-数据
-其他数据
我有这段代码,它确实可以完成工作,但速度太慢了。将 60k 次与 90k 进行比较,一定有更聪明的方法吗?
我怎样才能做得更好?
我可以使用 EF 而不是 Linq 吗?
using DAL;
using System;
using System.Linq;
public class ReadData
{
DataModelContainer model;
public static void Main()
{
new ReadData();
Console.WriteLine("Done");
Console.ReadLine();
}
ReadData()
{
this.model = new DataModelContainer(); ;
var idRecord = this.model.IdListSet.Where(x => x.IsChecked == true).ToList(); //90.000 Table1
var record = this.model.CompRegSet.Where(z => z.HtmlRecord != null).ToList(); //60.000 Table2
Console.WriteLine("This many ID's are marked: " + idRecord.Count);
Console.WriteLine("This many have data: " + record.Count);
Console.ReadLine();
int i = 0;
foreach (var item in record)
{
foreach (var ids in idRecord)
{
if (item.Id == ids.Id)
{
i++;
ids.IsChecked = false;
this.model.SaveChanges();
}
}
}
Console.WriteLine(i);
}
}
EF 未针对像这样读取和更新数千条记录进行优化。除其他事项外,您还必须担心不断增长的对象缓存、大量网络往返等。可以通过多种方式对其进行调整,但使用 EF 可能永远无法获得令人满意的性能。
在这些情况下,我认为使用raw SQL 是合理的,这样您就可以让数据库一次完成整个操作。如果愿意,您甚至可以将 SQL 包装在存储过程中。
在这种情况下,您可能会编写一个 UPDATE
语句,看起来像这样:
update a
set a.IsChecked = 0
from IdList a
where a.IsChecked = 1
and exists (select null
from CompReg b
where b.HtmlRecord is not null
and b.Id = a.Id)
如果您至少在 CompReg.Id
上定义了一个索引,您应该从中获得非常好的性能。
我有 2 个表,我想知道有多少标记为 IsCkecked=true 的记录在表 2 中没有数据。 然后我需要将它们标记为 false 以便它们得到第二次处理。
第二个程序正在处理所有 Table1 记录并将数据保存到 Table2。
表 1 90.000 条记录 -ID -IsChecked -其他数据
Table2 60.000 条记录 -ID -数据 -其他数据
我有这段代码,它确实可以完成工作,但速度太慢了。将 60k 次与 90k 进行比较,一定有更聪明的方法吗? 我怎样才能做得更好?
我可以使用 EF 而不是 Linq 吗?
using DAL;
using System;
using System.Linq;
public class ReadData
{
DataModelContainer model;
public static void Main()
{
new ReadData();
Console.WriteLine("Done");
Console.ReadLine();
}
ReadData()
{
this.model = new DataModelContainer(); ;
var idRecord = this.model.IdListSet.Where(x => x.IsChecked == true).ToList(); //90.000 Table1
var record = this.model.CompRegSet.Where(z => z.HtmlRecord != null).ToList(); //60.000 Table2
Console.WriteLine("This many ID's are marked: " + idRecord.Count);
Console.WriteLine("This many have data: " + record.Count);
Console.ReadLine();
int i = 0;
foreach (var item in record)
{
foreach (var ids in idRecord)
{
if (item.Id == ids.Id)
{
i++;
ids.IsChecked = false;
this.model.SaveChanges();
}
}
}
Console.WriteLine(i);
}
}
EF 未针对像这样读取和更新数千条记录进行优化。除其他事项外,您还必须担心不断增长的对象缓存、大量网络往返等。可以通过多种方式对其进行调整,但使用 EF 可能永远无法获得令人满意的性能。
在这些情况下,我认为使用raw SQL 是合理的,这样您就可以让数据库一次完成整个操作。如果愿意,您甚至可以将 SQL 包装在存储过程中。
在这种情况下,您可能会编写一个 UPDATE
语句,看起来像这样:
update a
set a.IsChecked = 0
from IdList a
where a.IsChecked = 1
and exists (select null
from CompReg b
where b.HtmlRecord is not null
and b.Id = a.Id)
如果您至少在 CompReg.Id
上定义了一个索引,您应该从中获得非常好的性能。