是否有更好的方法从表中删除8000万行?

时间:2017-07-05 11:51:56

标签: sql-server

有更好的方法从表中删除8000万行吗?

WHILE EXISTS (SELECT TOP 1 * FROM large_table)
    BEGIN
        WITH LT AS
            (
                SELECT TOP 60000 *
                FROM large_table
            )
        DELETE FROM LT
    END

这样做可以防止我的事务日志变得太大,但我需要知道是否有办法让这个过程更快?我已经让我的电脑运行了5天以上,现在运行这个脚本,我没有走得很远,非常快。

2 个答案:

答案 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