Как я могу эффективно сравнить свои данные с удаленной базой данных? - PullRequest
2 голосов
/ 05 февраля 2010

Мне нужно обновить базу данных контактов в SQL Server с изменениями, внесенными в удаленную базу данных (также SQL Server, на другом сервере в той же локальной сети). Я не могу внести какие-либо изменения в удаленную базу данных, которая является коммерческим продуктом. Я подключен к удаленной базе данных, используя связанный сервер. Обе таблицы содержат около 200 тыс. Строк.

Моя логика на данный момент очень проста: [следует упрощенный псевдо-SQL]

/* Get IDs of new contacts into local temp table */

Select remote.ID into #NewContactIDs
From Remote.Contacts remote
Left Join Local.Contacts local on remote.ID=local.ID
Where local.ID is null

/* Get IDs of changed contacts */

Select remote.ID into #ChangedContactIDs
From Remote.Contacts remote
Join Local.Contacts local on remote.ID=local.ID
Where local.ModifyDate < remote.ModifyDate

/* Pull down all new or changed contacts */

Select ID, FirstName, LastName, Email, ...
Into #NewOrChangedContacts
From Remote.Contacts remote
Where remote.ID in (
        Select ID from #NewContactIDs 
        union 
        Select ID from #ChangedContactIDs
    )

Конечно, выполнение этих объединений и сравнений по проводам убивает меня. Я уверен, что есть лучший способ - совет?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2010

Подумайте о сохранении lastCompareTimestamp (в последний раз, когда вы выполняли сравнение) в вашей локальной системе. Соберите все удаленные записи с помощью ModifyDates> lastCmpareTimestamp и выбросьте их в локальную временную таблицу. Работайте с ними локально.

0 голосов
/ 05 февраля 2010

Последняя дата сравнения - отличная идея

Еще один метод, с которым я добился большого успеха, - это SSIS (хотя у него есть кривая обучения, и он может быть излишним, если вы не будете много заниматься этим):

Сделать пакет

Установить источник данных для каждой из двух таблиц. Если вы ожидаете много изменений, потяните целые таблицы, если вы ожидаете только инкрементные изменения, то фильтруйте по дате модификации. Убедитесь, что результаты упорядочены

Соедините оба набора в полное внешнее соединение

Разделить результаты объединения на три группы: без изменений, измененные, новые

Удалите неизмененные записи, отправьте новые записи в место назначения вставки и отправьте измененные записи либо в промежуточную таблицу для обновления на основе SQL, либо - для нескольких строк - команду OLEDB с параметризованным оператором обновления.

ИЛИ, если в SQL Server 2008 используется Merge

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...