Предложение сделать это через 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
, что необходимо для того, чтобы вы сравнивали записи с одинаковыми идентификаторами. И если есть большое количество записей (вы не сказали, сколько записей есть), это займет много времени.
Обратите внимание, что если вы действительно передаете 60 ГБ данных для каждой таблицы, просто время передачи данных в сети 1 ГБ будет в лучшем случае 10 минут за стол. Скорее, дольше, чем это, особенно если в вашей сети есть другие вещи.
Вы действительно намного лучше запускаете это на сервере, если можете.
Сколько записей в вашем столе? Тысяча записей? Сто миллионов? Как медленно «медленно»? Десять секунд? Пять часов? –
Я сравниваю две базы данных 60 ГБ ... ее берут 6 часов + ... Мне нужно это сделать за час или чуть больше – StruggleIsReal
Извините, ребята, я забыл добавить одну важную деталь ... две таблицы, которые я сравниваю, отличаются от разных сервер. И я НЕ знаю подробностей о таблицах, потому что этот инструмент должен быть общим. – StruggleIsReal