有更好的方法从表中删除8000万行吗?
WHILE EXISTS (SELECT TOP 1 * FROM large_table)
BEGIN
WITH LT AS
(
SELECT TOP 60000 *
FROM large_table
)
DELETE FROM LT
END
这样做可以防止我的事务日志变得太大,但我需要知道是否有办法让这个过程更快?我已经让我的电脑运行了5天以上,现在运行这个脚本,我没有走得很远,非常快。
答案 0 :(得分:0)
您可以简单地截断表格。
TRUNCATE TABLE large_table
GO
您也可以使用where where条件删除。删除所花费的时间取决于各个方面。您可以通过在WHILE循环条件下消除SELECT查询来降低成本。
DECLARE @rows INT = 1
WHILE (@rows>0)
BEGIN
DELETE TOP 1000 *
FROM large_table
@rows = @@ROWCOUNT
END
答案 1 :(得分:-1)
如果日志文件已满,批量删除将创建大量日志并进行回滚。
您可以批量删除并确保每个交易都已提交。
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