偶尔,我需要清除数据库中的匿名用户配置文件.一位同事建议我使用这个程序,因为它可以不时地为其他程序运行一点喘息空间.
WHILE EXISTS (SELECT * FROM aspnet_users WITH (NOLOCK)
WHERE userID IN (SELECT UserID FROM #AspnetUsersToDelete))
BEGIN
SET ROWCOUNT 1000
DELETE FROM aspnet_users WHERE userID IN (SELECT UserID FROM #AspnetUsersToDelete )
print 'aspnet_Users deleted: ' + CONVERT(varchar(255), @@ROWCOUNT)
SET ROWCOUNT 0
WAITFOR DELAY '00:00:01'
END
Run Code Online (Sandbox Code Playgroud)
这是我第一次看到使用的NOLOCK关键字,而rowcount的逻辑似乎倒退了.是否有其他人使用类似的技术在长时间运行的过程中提供窗口,这是最好的做事方式吗?
任何时候我预计会删除大量的行,我会做类似的事情来保持事务批量大小合理.
对于SQL Server 2005+,您可以使用DELETE TOP (1000)...
而不是SET ROWCOUNT
语句.我经常这样做:
SELECT NULL; /* Fudge @@ROWCOUNT value for first time in loop */
WHILE (@@ROWCOUNT <> 0) BEGIN
DELETE TOP (1000)
...
END /* WHILE */
Run Code Online (Sandbox Code Playgroud)