我想知道如果两个ms sql表在c#中具有完全相同的内容,我可以比较的最快方式!
这是规则:如果任何行有差异,程序中止并报告"不同"。如果没有发现任何差异,程序将一直持续到最后并报告"相同"
我目前尝试使用sqlDataReader逐行比较...这个方法真的很慢。 然后我使用适配器填充dataTable,并使用(从stackoverflow中的其他帖子中找到),这仍然很慢:
var difference = table1.AsEnumerable().Except(table2.AsEnumerable(), DataRowComparer.Default);
return differences.Any() ? false : true;
我是c#的新手,不知道太多的方法。任何人都可以建议我加快比较的方法。喜欢dataReader还是dataTable? LinQ还是循环?谢谢大家!
答案 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并比较输出。