Мне нужно удалить огромное количество данных, не увеличивая процессор SQL сервера.
Вот пример моего запроса. Подзапрос возвращает около 999 тысяч строк, и мне нужно удалить одну за другой. Но проблема это удаляет первую тысячу и дает ошибку
Msg -2, Level 11, State 0, Line 0
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
DECLARE @i INT
CREATE TABLE #TempListingTable (ID INT Primary Key IDENTITY(1,1), ListingID INT)
DECLARE @numrows INT
DECLARE @ListingID INT
INSERT #TempListingTable
SELECT T1.ListingID
FROM Table T1 WITH(NOLOCK)
LEFT OUTER JOIN Table T2
ON T1.ID = T2.ID
WHERE T1.ID IS NULL AND T1.ID IS NOT NULL
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM #TempListingTable)
IF @numrows > 0
WHILE (@i <= (SELECT MAX(ID) FROM #TempListingTable))
BEGIN
SET @ListingID = (SELECT ListingID FROM #TempListingTable WHERE ID = @i)
DELETE Listing WHERE ListingID = @ListingID
SET @i = @i + 1
END
Если я удаляю в подзапросе, как вы можете видеть ниже, процессор идет вверх и дает таймауты
DELETE T1
FROM Table T1 WITH(NOLOCK)
LEFT OUTER JOIN Table T2
ON T1.ID = T2.ID
WHERE T1.ID IS NULL AND T1.ID IS NOT NULL
Каков наилучший подход в этом случае?