Как удалить огромное количество данных без увеличения загрузки процессора на сервере? - PullRequest
0 голосов
/ 13 сентября 2011

Мне нужно удалить огромное количество данных, не увеличивая процессор 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

Каков наилучший подход в этом случае?

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Сначала нужно исправить свой sql, он никогда не должен удалять строки, так как T1.ID равен null, а T1.ID не равен null.Исправьте это и используйте что-то вроде этого

WHILE 1 = 1
BEGIN

    DELETE TOP 1000 T1  
    FROM Table T1 WITH(NOLOCK) 
    LEFT OUTER JOIN Table T2          
    ON T1.ID = T2.ID  
    WHERE 1 = 2
    -- replace 'where' statement with a prober wherestatement. 
    -- I assume this is the 'where' statement you want
    --WHERE T2.ID IS NULL 
    --AND T1.ID IS NOT NULL

    IF @@ROWCOUNT = 0 BREAK
END
0 голосов
/ 13 сентября 2011

Это тайм-аут .NET, и не имеет ничего общего с SQL Server.Вам не нужно увеличивать время ожидания, вам нужно пакетно удалить.Если вы говорите, что он удаляет первую тысячу, а затем выдает ошибку, возьмите свой сценарий для выполнения удаления и добавьте его в процесс, который ограничивает количество удаляемых записей 1000, используя либо TOP 1000, либо DELETE TOP (1000), итогда у приложения есть огонь, который proc неоднократно.Попросите, чтобы proc дал возвращаемое значение (0, если больше нет строк для удаления, 1, если есть) для управления приложением, запускающим процесс.

В противном случае, вы можете уточнить, почему вам нужно удалить почти 100Kстроки по одному?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...