У меня есть таблица с очень большим количеством строк, которую я хочу выполнить с помощью динамического SQL.Это в основном проверки существования и операторы вставки, и я хочу перенести данные из одной производственной базы данных в другую - мы объединяем транзакционные данные.Я пытаюсь найти оптимальный способ выполнения строк.
Я нашел метод объединения для добавления всех строк друг к другу, чтобы не быть эффективным для этого, особенно когда число строк, выполненных ввремя больше, чем ~ 100.
Предположим, что структура исходной таблицы является произвольной:
CREATE TABLE [dbo].[MyTable]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[DataField1] [int] NOT NULL,
[FK_ID1] [int] NOT NULL,
[LotsMoreFields] [NVARCHAR] (MAX),
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED ([ID] ASC)
)
CREATE TABLE [dbo].[FK1]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [int] NOT NULL, -- Unique constrained value
CONSTRAINT [PK_FK1] PRIMARY KEY CLUSTERED ([ID] ASC)
)
Другое требование - я отслеживаю исходную таблицу PK по сравнению с целевой PKи произошла ли вставка, или я уже перенес эту строку в цель.Для этого я отслеживаю перенесенные строки в другой таблице следующим образом:
CREATE TABLE [dbo].[ChangeTracking]
(
[ReferenceID] BIGINT IDENTITY(1,1),
[Src_ID] BIGINT,
[Dest_ID] BIGINT,
[TableName] NVARCHAR(255),
CONSTRAINT [PK_ChangeTracking] PRIMARY KEY CLUSTERED ([ReferenceID] ASC)
)
Мой существующий метод выполняет динамический sql, сгенерированный хранимой процедурой.Хранимая процедура выполняет поиск PK, поскольку исходная система имеет различные значения PK для таблицы [dbo]. [FK1].Например,
IF NOT EXISTS (<ignore this existence check for now>)
BEGIN
INSERT INTO [Dest].[dbo].[MyTable] ([DataField1],[FK_ID1],[LotsMoreFields]) VALUES (333,(SELECT [ID] FROM [Dest].[dbo].[FK1] WHERE [Name]=N'ValueFoundInSource'),N'LotsMoreValues');
INSERT INTO [Dest].[dbo].[ChangeTracking] ([Src_ID],[Dest_ID],[TableName]) VALUES (666,SCOPE_IDENTITY(),N'MyTable'); --666 is the PK in [Src].[dbo].[MyTable] for this inserted row
END
Итак, если у вас есть миллион таких, это не быстро.
Есть ли рекомендуемый эффективный способ сделать это?