Пакетное удаление данных - Azure SQL Server - PullRequest
0 голосов
/ 04 апреля 2019

По какой-то причине, когда я пытаюсь выполнить пакетное удаление на SQL Server Azure, это занимает НАВСЕГДА.Ниже приведен код, который я пытаюсь сделать.Выбор быстр.Обе таблицы имеют индекс для столбца PlateNumber.

WHILE(EXISTS(SELECT TOP 1 1 FROM TableName AS A WITH(NOLOCK)
             LEFT JOIN  #PlateNumbers2Keep AS B ON B.PlateNumber = A.PlateNumber
             WHERE      B.PlateNumber IS NULL) )
BEGIN
       BEGIN TRANSACTION    
       DELETE       TOP (1)             A 
       FROM         TableName AS A
       LEFT JOIN    #PlateNumbers2Keep   AS B ON B.PlateNumber = A.PlateNumber
       WHERE        B.PlateNumber IS NULL  
       COMMIT;
END 

1 Ответ

0 голосов
/ 04 апреля 2019

Вы не тестируете с 1 записью, ваш цикл будет работать до тех пор, пока в этой временной таблице не будет записей, и будет удалять по одной строке за раз, что довольно ужасно.

Попробуйте это:

DECLARE @rowsAffected BIGINT = 1

WHILE @rowsAffected <> 0
BEGIN
    BEGIN TRANSACTION

    DELETE TOP (100000) A
      FROM TableName A
     -- anti-semi join is better for performance than regular left
     WHERE NOT EXISTS (SELECT 1 
                         FROM #PlateNumbers2Keep B 
                        WHERE B.PlateNumber = A.PlateNumber)

    SET @rowsAffected = @@ROWCOUNT

    COMMIT;
END;
...