繁体   English   中英

有没有更好的方法从表中删除8000万行以上?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM