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

时间:2016-05-02 06:17:00

标签: c# sql-server algorithm linq comparison

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

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

我目前尝试使用sqlDataReader逐行比较...这个方法真的很慢。 然后我使用适配器填充dataTable,并使用(从stackoverflow中的其他帖子中找到),这仍然很慢:

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

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

2 个答案:

答案 0 :(得分:1)

通过SQL Server进行此操作的建议很好,如果可以的话,可能会是最快的。 https://www.mssqltips.com/sqlservertip/2779/ways-to-compare-and-find-differences-for-sql-server-tables-and-data/上的文章提供了一些建议,但我不知道是否有任何建议进行逐场比较。他们引用的tablediff命令看起来特别有趣。

至少,您应该尝试一个或多个尝试,只是为了了解您可以做多快。

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

if ($value = $rec['ip'] <= $cphigh_ip && $cplow_ip <= $value = $rec['ip']) {
    $cpyes="on ";
    $number= $value = $rec['ip'];
    $whmLink=$number[strlen($number)-1];
    ?>
        <td><input type="submit" name="cPanelButton" onClick="window.location.href='https://www.<?=$variable; ?>.test.com'" value="cPanel"></td>
    <?php
}
else {
    $cpno="not on cPanel";
    ?>
        <td></td>
    <?php
}

该代码没有经过优化,也没有进行任何错误处理,实际上不会编译,因为我没有编写字段比较代码。但它应该让你知道需要发生什么。老实说,我不知道它是否比你已经拥有的更快,但它可能值得一试。你可以在那里放一个计数器并在每1000行之后输出一次,这样你就知道它的速度有多快。

但是,您最大的问题是数据库必须排序以满足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 } ,这是确保您使用相同ID比较记录所必需的。如果有大量记录(你没有说明有多少记录),那将需要相当长的时间。

另请注意,如果您确实为每个表传输了60 GB的数据,那么1 GB网络上的数据传输时间最多每个表10分钟。更可能更长的时间,特别是如果您的网络上发生了其他事情。

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

答案 1 :(得分:0)

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

尝试使用SQL加入。由于DB应该针对连接进行优化,因此它会更快(假设有一些索引可以帮助加入)。

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