Быстрая загрузка данных со связанного сервера ORACLE в MSSQL - PullRequest
0 голосов
/ 21 октября 2019

У меня есть процедуры в БД MSSQL для загрузки данных со связанного сервера ORACLE

, в БД MSSQL есть таблицы:

  1. table_1 содержит список заказов ID
  2. таблица_2 содержит подробную информацию о заказах

В БД MSSQL используется процедура для обновления и загрузки данных в таблицу_2, процедура использует оператор IN вместе с CURSOR, она работает долгое время. Таблица_2 содержит 1-2 миллиона строк.

Есть ли другой способ / способ быстрой загрузки данных из СУБД ORACLE в MSSQL с использованием исходных данных из таблицы_1?

1 Ответ

0 голосов
/ 22 октября 2019

Звучит так, как будто вы хотите синхронизировать данные между SQL * Server и Oracle. Лучший способ - использовать коммерческий продукт, который делает это. Я разработал некоторые процедуры в нашем магазине, которые делают это, но это не тривиально.

Самый простой способ сделать это, если у вас есть восходящий UID. Запишите наибольшее значение в таблицу в конце синхронизации. В следующий раз, когда вы запустите синхронизацию, начните с> уникального значения.

Я стараюсь избегать курсоров, я использую insert / select. Их гораздо проще кодировать, они работают очень быстро и не работают как единое целое. Я копирую 600K записей каждые 4 часа из Oracle на SQL Server.

Пример ниже - T SQL и выполняется с SQL Server. Этот же код легко переводится в PL / SQL, если вам нужно выполнить из Oracle. Я сделал это обоими способами.

  • @ last_loaded - отследить самый высокий идентификатор, который был загружен в базы данных
  • tracker_table - таблица, используемая для хранения значений last_loaded.
  • load_type = 2 - таблица отслеживания может использоваться для отслеживания идентификаторов для различных нагрузок.
  • oracledb .. - имя сервера SQL Server, связанного с Oracle
  • COPYSCHEMA - имя схемы, содержащей таблицу Oracle. ВСЕГДА УКАЗАТЬ!
  • COPYTABLE - имя таблицы Oracle, из которой мы копируем

    - Пример кода

     DECLARE @last_loaded INT;
    
     SELECT last_loaded
     INTO @last_loaded
       FROM tracker_table
      WHERE load_type = '2';
    
     INSERT INTO            LOAD_TABLE ( ID
                                       , COLUMNA
                                       , COLUMNB
                                       , COLUMNC )
     SELECT ID
          , columna
          , columnb
          , columnc
       FROM oracledb..COPYSCHEMA.COPYTABLE
      WHERE ID > coalesce(@last_loaded, 0);
    
     SELECT MAX(LAST_LOADED)
     INTO @last_loaded
       FROM LOAD_TABLE;
    
     UPDATE TRACKER_TABLE
       SET
           LAST_LOADED = @last_loaded
      WHERE LOAD_TYPE = 2;
    
...