Более быстрый способ передачи данных таблицы со связанного сервера - PullRequest
2 голосов
/ 16 марта 2010

После долгих хлопот мне удалось установить правильный драйвер ODBC и успешно создать связанный сервер на SQL Server 2008, с помощью которого я могу получить доступ к своей базе данных PostgreSQL с сервера SQL.

Я копирую все данные из некоторых таблиц в базе данных PgSQL в SQL Server, используя операторы слияния, которые имеют следующий вид:

with mbRemote as 
    (
        select 
            * 
        from 
            openquery(someLinkedDb,'select * from someTable')
    ) 
merge into someTable mbLocal 
using mbRemote on mbLocal.id=mbRemote.id
when matched 
        /*edit*/ 
        /*clause below really speeds things up when many rows are unchanged*/
        /*can you think of anything else?*/
        and not (mbLocal.field1=mbRemote.field1
                and mbLocal.field2=mbRemote.field2
                and mbLocal.field3=mbRemote.field3
                and mbLocal.field4=mbRemote.field4)
        /*end edit*/
        then 
        update
        set
                mbLocal.field1=mbRemote.field1,
                mbLocal.field2=mbRemote.field2,
                mbLocal.field3=mbRemote.field3,
                mbLocal.field4=mbRemote.field4
when not matched then 
        insert
        (
            id,
            field1,
            field2,
            field3,
            field4
        )
        values
        (
            mbRemote.id,
            mbRemote.field1,
            mbRemote.field2,
            mbRemote.field3,
            mbRemote.field4
        )
WHEN NOT MATCHED BY SOURCE then delete;

После выполнения этого оператора локальная (SQL Server) копия полностью синхронизируется с удаленной (PgSQL-сервер).

Несколько вопросов об этом подходе:

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

1 Ответ

1 голос
/ 19 марта 2010

Это выглядит как разумный метод, если вы не можете или не хотите использовать такой инструмент, как SSIS.

Вы можете добавить проверку строки соответствия, чтобы проверить, произошли ли изменения, например:

when matched and mbLocal.field1 <> mbRemote.field1 then

Это может быть громоздким, если у вас есть несколько столбцов для проверки, поэтому вы можете добавить проверочный столбец (например, LastUpdatedDate), чтобы сделать это проще.

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