比较两个 ms sql 表是否相同的最快方法

fastest way to compare if two ms sql tables are the same

我想知道如果两个 ms sql table 在 c# 中具有完全相同的内容,我可以用最快的方式进行比较!

这是规则:如果任何行有差异,程序中止并报告 "different"。如果没有发现差异,程序将一直运行到最后并报告 "same"

我目前尝试使用 sqlDataReader 逐行比较...这种方法真的很慢。 然后我使用适配器来填充数据表,并使用(从 Whosebug 中的其他 post 找到),这仍然很慢:

var difference = table1.AsEnumerable().Except(table2.AsEnumerable(), DataRowComparer.Default);
return differences.Any() ? false : true;

我是 c# 的新手,不知道太多方法。任何人都可以建议我加快比较的方法。像 dataReader 或 dataTable? LinQ 还是循环?谢谢大家!

现在您需要将所有数据加载到内存中,并将每一行与每一行进行比较,这是低效的。

尝试使用 SQL 加入。由于数据库应该针对连接进行优化,因此速度会快得多(前提是有一些索引可以帮助连接)。

如果由于某种原因您不能这样做,另一种方法是使用哈希来加快速度。逻辑很简单:读取 table 1,计算每一行的散列(内置散列函数应该可以正常工作),将它们存储在一个集合中(或将它们放入数组中并排序),然后对 table 2 执行相同操作并比较输出。

通过 SQL 服务器执行此操作的建议很好,如果可以的话,可能是最快的。他们引用的 https://www.mssqltips.com/sqlservertip/2779/ways-to-compare-and-find-differences-for-sql-server-tables-and-data/ gives some suggestions, although I don't know if any of those do field-by-field comparisons. The tablediff 命令中的文章看起来特别有趣。

至少,您应该尝试其中的一项或多项,以了解您的速度有多快。

您可以使用 SqlDataReader 轻松地进行逐条记录搜索,这提供了对结果的优化的只进、只读访问。基本思路是:

var query1 = "Select * from table1 order by recordId";
var connection1 = new SqlConnection(connectionString);
var cmd1 = new SqlCommand(query1, connection1);
var reader1 = cmd1.ExecuteReader();

var query2 = "Select * from table2 order by recordId";
var connection2 = new SqlConnection(connectionString);
var cmd2 = new SqlCommand(query2, connection2);
var reader2 = cmd2.ExecuteReader();

var gotRow1 = reader1.Read();
var gotRow2 = reader2.Read();

while (gotRow1 && gotRow2)
{
    bool isSame = true;
    for each field
        if (compare(field1, field2) != true)
        {
            isSame = false;
            break;
        }
    if (isSame)
    {
        gotRow1 = reader1.Read();
        gotRow2 = reader2.Read();
    }
}

if (gotRow1 || gotRow2)
{
    // there are differences
}

该代码没有优化,没有做任何错误处理,实际上不会编译,因为我没有写字段比较代码。但它应该让您了解需要发生什么。老实说,我不知道它是否会比你已经拥有的更快,但它可能值得一试。您可以在其中放置一个计数器并在每 1,000 行或其他内容后输出,以便您知道它的运行速度。

不过,您最大的问题是数据库必须排序以满足 order by,这是确保您比较具有相同 ID 的记录所必需的。而如果有大量的记录(你没说有多少条记录),那将需要相当长的时间。

另请注意,如果您真的为每个 table 传输 60 GB 的数据,那么 1 GB 网络上的数据传输时间最多 10每 table 分钟。更有可能比这更长,尤其是当您的网络上发生其他事情时。

如果可以的话,在服务器上 运行 你真的更好。