Пакетная обработка Microsoft SQL Server прерывистой фиксации в хранимой процедуре - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь вставить миллионы записей в таблицу Microsoft SQL Server из другой таблицы (в том же Microsoft SQL Server) с вычислением номера партии с использованием функции row_number(), как показано ниже.

CEILING((ROW_NUMBER() OVER (ORDER BY ITEM,LOC))/CONVERT(FLOAT,'''
                       +CONVERT(VARCHAR(55),@PLANNING_BATCH_SIZE)+'''))-1+convert(float,'''+convert(varchar(55),@PREVIOUSEBATCHSIZE)+''' ) AS BATCH_NUM

Как только все эти записи будут вставлены в таблицу с номерами партий, я вызову метод Java для запуска другого процесса с использованием данных каждой партии.

Теперь для вставки миллионов записейзанимает минуты времени, Java-метод должен дождаться завершения всей вставки.У меня вопрос: есть ли у нас возможность в SQL Server применить прерывистые коммиты в запросе INSERT INTO SELECT.

1 Ответ

0 голосов
/ 26 февраля 2019

Если вы хотите вставить некоторые строки, зафиксировать, а затем начать вставлять другие, вам нужно сделать это в пакетном режиме.Здесь у нас очень мало информации, поэтому это очень простой псевдо-SQL пример того, как может вставлять данные небольшими партиями:

BEGIN TRANSACTION;

INSERT INTO YourDestinationTable ({COLUMNS})
SELECT TOP 1000
       {COLUMNS}
FROM YourSourceTable ST
WHERE NOT EXISTS (SELECT 1
                  FROM YourDestinationTable YD
                  WHERE YD.{IDENTITY COLUMN} = ST.{IDENTITY COLUMN});

COMMIT;

WHILE @@ROWCOUNT > 0 BEGIN

    BEGIN TRANSACTION;

    INSERT INTO YourDestinationTable ({COLUMNS})
    SELECT TOP 1000
           {COLUMNS}
    FROM YourSourceTable ST
    WHERE NOT EXISTS (SELECT 1
                      FROM YourDestinationTable YD
                      WHERE YD.{IDENTITY COLUMN} = ST.{IDENTITY COLUMN});

    COMMIT;

END;
...