[英]Is there a better way to DELETE 80 million+ rows from a table?
有没有更好的方法从表中删除8000万行以上?
WHILE EXISTS (SELECT TOP 1 * FROM large_table)
BEGIN
WITH LT AS
(
SELECT TOP 60000 *
FROM large_table
)
DELETE FROM LT
END
这样做是为了防止事务日志变得太大,但是我需要知道是否有办法使此过程更快地进行? 我已经在计算机上运行了5天以上,并且正在运行此脚本,但是我走得还不是很快。
您可以简单地截断表。
TRUNCATE TABLE large_table
GO
您也可以通过where条件使用delete。 删除所花费的时间取决于各个方面。 您可以通过消除WHILE循环条件下的SELECT查询来降低成本。
DECLARE @rows INT = 1
WHILE (@rows>0)
BEGIN
DELETE TOP 1000 *
FROM large_table
@rows = @@ROWCOUNT
END
批量删除将创建大量日志,如果日志文件已满,则会发生回滚。
您可以批量删除,并确保每个交易都已提交。
DECLARE @IDCollection TABLE (ID INT)
DECLARE @Batch INT = 1000;
DECLARE @ROWCOUNT INT;
WHILE (1 = 1)
BEGIN
BEGIN TRANSACTION;
INSERT INTO @IDCollection
SELECT TOP (@Batch) ID
FROM table
ORDER BY id
DELETE
FROM table
WHERE id IN (
SELECT *
FROM @IDCollection
)
SET @ROWCOUNT = @@ROWCOUNT
IF (@ROWCOUNT = 0)
BREAK
COMMIT TRANSACTION;
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.