2015-10-13 2 views
0

Я копирую данные из SQL Server в Oracle с пакетом SSIS, и я хочу улучшить производительность копирования с инкрементным обновлением.Инкрементное обновление таблицы

Моя идея заключается в следующем:

  1. Добавление новых записей таблицы (удалить их, прежде чем затем добавить)
  2. Удалить "Удаленные" записей

Код:.

drop table A1 
drop table A2 

--Old Table 
create Table A1(id int, 
       a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int) 

--New Table 
create Table A2(id int, 
       a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int) 

insert into A1 (id, a1, a2, a3, a4, a5, a6, a7, a8) 
values (1,1,2,3,4,5,6,7,8), (2,2,2,5,4,2,6,2,8), (3,3,2,5,4,5,4,3,8), 
     (4,3,1,3,4,5,7,3,8) 

insert into A2 (id, a1, a2, a3, a4, a5, a6, a7, a8) 
values (1,2,2,3,4,5,6,7,8), (2,2,2,5,4,2,6,2,8), (3,3,2,5,4,5,4,3,8) 
--1) Changed values 

select * from a2 
except 
select * from a1; 

--2) "Deleted" Values. If I Have primary key in A1,A2 the result is simply get by query 
select a1.* 
from A1 
left join A2 on a2.id = a1.id 
where a2.id is null 

Но у меня нет первичного ключа на моих столах в моей реальной ситуации. Как я могу достичь 2 пункта другим способом, не присоединяясь к первичному ключу?

Результат запроса:

id a1 a2 a3 a4 a5 a6 a7 a8 
1 2 2 3 4 5 6 7 8 


id a1 a2 a3 a4 a5 a6 a7 a8 
4 3 1 3 4 5 7 3 8 

ответ

2

Используя MERGE заявление вы можете сделать INSERT, UPDATE & DELETE в одной операции, и он идеально подходит для дельта нагрузки.

Пример кода:

MERGE A2 AS target 
    USING (SELECT * FROM A1) AS source 
    ON (target.Id = source.Id AND target.a1 = Source.a1...) -- More join condition 
    WHEN MATCHED THEN 
     UPDATE SET a2 = source.a2, a3 = source.a3 ------ more columns 
WHEN NOT MATCHED THEN 
    INSERT (Id, A1, a1, a2....) 
    VALUES (source.Id, source.a1, source.a2.....) 

WHEN NOT MATCHED BY SOURCE 
     THEN DELETE 
END; 

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

В приведенном выше запросе вы можете сохранить столбцы, которые вы хотите сравнить

ON (target.Id = source.Id И target.a1 = Source.a1 ...) - Еще присоединиться

в SSIS

Вы можете использовать преобразование LOOKUP найти совпадения и не совпадения записей, а затем вставлять или удалять записи. Любой случай, если вы рассматриваете все столбцы при сравнении исходной таблицы с местом назначения и обновлением, не имеет смысла.

+0

Merge - хороший инструмент. Он работает, если оба источника и адресатов находятся в SQL Server. Но моим источником является SQL Server, а местом назначения является Oracle. И у меня нет первичного ключа в таблицах. Merge использует условие соединения. Мое представление - перенос строк через поток данных, который необходимо добавить и удалить. И затем в Oracle выполните это действие –

+0

@VitalyAscheulov Как вы подключаетесь к Oracle? Я полагаю, что у вас будет связанное соединение с сервером, в этом случае вы сможете использовать (** MERGE ORALCELinkedServer.A2 AS target **) –

+0

Я подключаюсь через поставщика ADO.NET. Поток данных с исходным кодом - сервер Sql, назначение - Oracle [Изображение с потоком данных] (http://postimg.org/image/f3v55lqtl/) –

0

Вы можете использовать CDC или другой механизм доставки журналов, основанных на журнальных файлов вместо запросов. Если вы все еще хотите использовать SSIS с запросами -

Вы пробовали работать с rowversion на SQL Server, чтобы найти различия, это будет быстрее, чем кроме наверняка.

select * from a2 where rowversion> @lastmaxrowversion;

Чтобы найти удаление является трудной задачей, то лучшее, что вы можете сделать, это

выберите a1.id от a1, где не существует (выберите верхний 1 1 из а2, где a1.id = a2. Я бы);

Если вы можете добавить триггер delete и сохранить идентификаторы в таблице, это тоже будет неплохо.

  • Имейте в виду, что многие компании действительно не заботятся о удаленных записях в своем процессе ETL, поскольку хранилище больше не является случаем. Кроме того, в настоящее время вы можете проектировать свою систему без удаления с архивированием таблицы разделов или активного флага. В любом случае, если удаление по-прежнему важно, возможно, попробуйте сделать разные интервалы для вставки/обновления и удаления. Например, каждые 10 минут вы проверяете вставку/обновление, где удаляете каждые 24 часа.
Смежные вопросы