Есть ли эффективное решение / подход?
Я создаю инструмент, который принимает две базы данных в качестве входных данных, сравнивает таблицы и показывает "только различия в данных" между таблицами.
Например,
Исходная база данных - персона, заказы (две таблицы)
База данных назначения - Персона, Заказы (Две Таблицы)
Теперь мое приложение сравнивает Person в исходной базе данных с Person в базе данных Destination и отображает только те записи, которые находятся в исходном Person, а не в Person назначения.
Вот мой подход
- Загрузите обе базы данных в два DataSet (исходный DataSet, назначение в DataSet).
- Сравните обе таблицы строка за строкой.
- И если найдены какие-либо изменения, такие как строка в источнике Person, которых нет в Person назначения, вставьте эти строки в Person назначения.
Мой вопрос: есть ли лучший / эффективный способ добиться этого?
Перебор целых баз данных является наименее эффективным решением.
2 ответа
Обычно лучше всего перенести работу в базу данных. Создать FULL OUTER JOIN
запрос для каждой пары таблиц, чтобы вычислить различия на сервере. Это будет гораздо быстрее, чем передавать все данные клиенту.
В частности, данные и т. Д. Не очень эффективны.
Другой подход - запрос отсортированных строк и выполнение объединения слиянием в памяти для двух потоков результатов. Вы можете найти пример кода для объединения двух отсортированных потоков в сети.
Обычно вы хотите выполнять как можно больше обработки в базах данных. Это особенно верно для обработки, которая собирается прочитать все содержимое таблицы. Реляционные базы данных предназначены для этого типа обработки.
Если обе базы данных находятся на одном и том же сервере, у вас может быть такой запрос, чтобы получить записи о людях в источнике, которых нет в месте назначения:
select s.*
from source..person
except
select d.*
from destination..person;
Каковы преимущества этого подхода?
- SQL Server может выполнять запросы, используя несколько потоков.
- SQL Server может использовать индексы (хотя это может не подходить для этого конкретного запроса).
- SQL Server возвращает только те данные, которые необходимы приложению.
Если они не находятся на одном сервере, вы можете использовать связанный сервер для подключения серверов. Документация - хорошее место, чтобы понять, как использовать связанные серверы. Это будет даже работать, если серверы используют разные базы данных.