Вставить в оператор застрял в цикле - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть две таблицы Table1 и Table2, и я пытаюсь вставить все данные из Table1 в Table2. Для этого у меня есть оператор Insert Into, который вставляет пакетами, как показано ниже

CREATE PROCEDURE insert_table_data @tp_int INT AS
DECLARE @rc INT
SET @rc = 1
WHILE @rc > 0
BEGIN
    BEGIN TRANSACTION
    INSERT INTO table_2(
    col1,
    col2,
    time_period
    )
    SELECT TOP (500) col1, col2, @tp_int FROM table_1
    DELETE TOP (500) FROM table_1
    SET @rc = @@ROWCOUNT
    COMMIT TRANSACTION;
END

В идеале я хотел бы сделать это без использования оператора Delete. Когда я вынимаю оператор удаления, сохраненные процы застревают в al oop. Я предполагаю, что это потому, что он продолжает выбирать Top (500) из table_1, не продвигаясь дальше вниз по записям. Любые идеи о том, как изменить хранимые процы?

1 Ответ

0 голосов
/ 16 апреля 2020

Если вы не хотите удалять по пути, я бы рассмотрел использование типа запроса OFFSET / FETCH. Очевидно, что производительность начнет падать дальше, чем вы должны прочитать в таблицу, но я бы проверил ее и рассмотрел, как использовать индекс, чтобы помочь.

И если вы перемещаете миллионы строк, я бы немного увеличьте размер партии.

DECLARE @batchsize INT
DECLARE @start INT
DECLARE @numberofrows INT

SELECT @numberofrows = COUNT(*) from table_1

SET @batchsize = 500
SET @start = 1

WHILE @start < @numberofrows
BEGIN
    BEGIN TRANSACTION

    INSERT INTO table_2(col1,col2,time_period)
        SELECT  col1, col2, @tp_int 
        FROM table_1
            ORDER BY time_period,col1,col2
                OFFSET @start ROWS
                FETCH NEXT @batchsize ROWS ONLY

    SET @start += @batchsize + 1

    COMMIT TRANSACTION;
END
...