SQL Server ускоряется во время цикла с INSERT INTO - PullRequest
0 голосов
/ 11 мая 2018

SQL WHILE Цикл медленный с вставкой в.Есть ли способ ускорить запрос?

Я хочу вставить 500 000 строк.Если после каждых 10000 строк будет коммит, будет ли он быстрее?

Пример:

Вставить строки из DB1 в DB2 и получить первичный идентификатор ключа автокремента из DB2 в DB1.

CREATE TABLE #TempTable
    (
        ROWID int identity(1,1) primary key,
        Comp_Key_1 NVARCHAR(20),
        Comp_Key_2 NVARCHAR(256),
        Comp_Key_3 NVARCHAR(256)
    )
INSERT INTO #TempTable (Comp_Key_1, Comp_Key_2, Comp_Key_3) 
SELECT Comp_Key_1, Comp_Key_2, Comp_Key_3 FROM [DB1].[dbo].FILES


DECLARE @MAXID INT, @Counter INT, @Comp_Key_1 NCHAR(20), @Comp_Key_2 nvarchar(256), @Comp_Key_3 nvarchar(256), @id_current int,;
SET @COUNTER = 1
SELECT @MAXID = COUNT(*) FROM #Temp

WHILE (@COUNTER <= @MAXID)
        BEGIN

            set @Comp_Key_1= (select Comp_Key_1_doc from #Temp where ROWID= @COUNTER)
            set @Comp_Key_2= (select Comp_Key_2_doc from #Temp where ROWID= @COUNTER)
            set @Comp_Key_3= (select Comp_Key_3_doc from #Temp where ROWID= @COUNTER)

            INSERT INTO [DB2].[dbo].[ADDRESS] (STREET,STREET_FROM,STREET_TO)
            SELECT STREET,STREET_FROM,STREET_TO
            FROM [DB1].[dbo].[ADDRESS]
            WHERE [DB1].[dbo].[ADDRESS].Comp_Key_1= @Comp_Key_1
               and [DB1].[dbo].[ADDRESS].Comp_Key_2=@Comp_Key_2
               and [DB1].[dbo].[ADDRESS].Comp_Key_3=@Comp_Key_3;

            set @id_current = IDENT_CURRENT('[DB2].[dbo].[ADDRESS]')

            update [DB1].[dbo].[ADDRESS]
            set id=@id_current
            where @Comp_Key_1=[ADDRESS].Comp_Key_1
              and @Comp_Key_2=[ADDRESS].Comp_Key_2
              and @Comp_Key_3=[ADDRESS].Comp_Key_3;

        SET @COUNTER = @COUNTER + 1


      END 
    COMMIT

У DB2 есть первичный ключ автокремента, который нужно перенести в DB1 после каждой вставленной строки.DB1 имеет составной ключ из 3 столбцов.Дизайн DB2 не включает составной ключ.

пример таблиц

Есть ли способ ускорить вставку?

1 Ответ

0 голосов
/ 15 мая 2018

Я ценю помощь!

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

Очень эффективно (заняло всего 15 минут) и не было необходимости в петле. Спасибо!

Это код:

BEGIN TRAN
CREATE TABLE #TempInserted
    (inserted_id int,Comp_Key_1 NVARCHAR(20), Comp_Key_2 NVARCHAR(256), Comp_Key_3 NVARCHAR(256))

MERGE [DB2].[dbo].[ADDRESS] AS T  -- target table T
USING (SELECT STREET,STREET_FROM,STREET_TO, Comp_Key_1,Comp_Key_2, Comp_Key_3
       FROM [DB1].[dbo].[ADDRESS] AS M ) S  -- source table S
ON 0=1
WHEN NOT MATCHED THEN
    INSERT (STREET,STREET_FROM,STREET_TO) -- target table T
    VALUES (STREET,STREET_FROM,STREET_TO) -- source table S

OUTPUT inserted.id, S.Comp_Key_1, S.Comp_Key_2, S.Comp_Key_3 
INTO #TempInserted(inserted_id,Comp_Key_1,Comp_Key_2,Comp_Key_3);

update [DB1].[dbo].[ADDRESS]
set id=#TempInserted.inserted_id 
FROM [BankMasterDB_migration].[dbo].LOANNUMBER AS M
JOIN #TempInserted ON M.Comp_Key_1=#TempInserted.Comp_Key_1
                  AND M.Comp_Key_2=#TempInserted.Comp_Key_2
                  AND M.Comp_Key_3=#TempInserted.Comp_Key_3

COMMIT
...