2016-05-02 2 views
1

Я хочу узнать самый быстрый способ сравнить, если две таблицы sql sqs имеют точно такой же контент в C#!Самый быстрый способ сравнить, если две таблицы sqs sqs одинаковы

Это правило: если какая-либо строка имеет разницу, программа прерывает и сообщает «другое». Если разницы не обнаружено, программа продолжит работу до конца и сообщит о «том же»

В настоящее время я опробовал использование sqlDataReader для сравнения строк за строкой, поскольку я иду ... этот метод действительно очень медленный. Затем я использовал адаптер для заполнения DataTable, а также использовать (найденный с другого поста в StackOverflow), и это все еще довольно медленно:

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

Я довольно новый для C#, не знаю, слишком много методов вокруг. Кто-нибудь может предложить мне, как я могу ускорить сравнение. например dataReader или dataTable? LinQ или цикл? Спасибо всем!

+0

Сколько записей в вашем столе? Тысяча записей? Сто миллионов? Как медленно «медленно»? Десять секунд? Пять часов? –

+0

Я сравниваю две базы данных 60 ГБ ... ее берут 6 часов + ... Мне нужно это сделать за час или чуть больше – StruggleIsReal

+0

Извините, ребята, я забыл добавить одну важную деталь ... две таблицы, которые я сравниваю, отличаются от разных сервер. И я НЕ знаю подробностей о таблицах, потому что этот инструмент должен быть общим. – StruggleIsReal

ответ

0

Теперь вам нужно загрузить все данные в память и сравнить каждую строку с каждой неэффективной строкой.

Попробуйте присоединиться к SQL. Поскольку БД следует оптимизировать для выполнения объединений, это будет намного быстрее (при наличии некоторых индексов, помогающих объединению).

Если вы не можете сделать это по какой-либо причине, альтернативой является ускорение его использования с помощью хэшей. Логика проста: прочитайте таблицу 1, вычислите хэш каждой строки (встроенные хеш-функции должны работать нормально), сохраните их в наборе (или поместите их в массив и отсортируйте), затем выполните то же самое с таблицу 2 и сравнить выход.

0

Предложение сделать это через 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 минут за стол. Скорее, дольше, чем это, особенно если в вашей сети есть другие вещи.

Вы действительно намного лучше запускаете это на сервере, если можете.