Я копирую данные из SQL Server в Oracle с пакетом SSIS, и я хочу улучшить производительность копирования с инкрементным обновлением.Инкрементное обновление таблицы
Моя идея заключается в следующем:
- Добавление новых записей таблицы (удалить их, прежде чем затем добавить)
- Удалить "Удаленные" записей
Код:.
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
Merge - хороший инструмент. Он работает, если оба источника и адресатов находятся в SQL Server. Но моим источником является SQL Server, а местом назначения является Oracle. И у меня нет первичного ключа в таблицах. Merge использует условие соединения. Мое представление - перенос строк через поток данных, который необходимо добавить и удалить. И затем в Oracle выполните это действие –
@VitalyAscheulov Как вы подключаетесь к Oracle? Я полагаю, что у вас будет связанное соединение с сервером, в этом случае вы сможете использовать (** MERGE ORALCELinkedServer.A2 AS target **) –
Я подключаюсь через поставщика ADO.NET. Поток данных с исходным кодом - сервер Sql, назначение - Oracle [Изображение с потоком данных] (http://postimg.org/image/f3v55lqtl/) –