代码之家  ›  专栏  ›  技术社区  ›  StruggleIsReal

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

  •  3
  • StruggleIsReal  · 技术社区  · 9 年前

    我想知道如果两个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 回复  |  直到 9 年前
        1
  •  2
  •   Jim Mischel    9 年前

    建议通过SQL Server来实现这一点是很好的,如果可以的话,这可能是最快的。文章位于 https://www.mssqltips.com/sqlservertip/2779/ways-to-compare-and-find-differences-for-sql-server-tables-and-data/ 给出了一些建议,尽管我不知道其中是否有进行了逐个领域的比较。这个 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
    }
    

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

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

    还要注意,如果您真的要为每个表传输60GB的数据,那么在1GB网络上传输数据的时间将是 充其量是 每张桌子10分钟。很可能比这个时间更长,尤其是当您的网络上发生其他事情时。

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

        2
  •  0
  •   Sorin    9 年前

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

    尝试使用SQL加入。由于数据库应该针对连接进行优化,所以它会更快(如果有一些索引可以帮助连接)。

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