首页 > 解决方案 > 与 Powershell 一起使用时,带有 Delete 语句的 SQL Server 存储过程会超时

问题描述

当我使用 PowerShell 执行存储过程时,我会超时。

powershell -NoProfile -NonInteractive -Command "Invoke-DbaQuery -Query 'EXEC [bas].[sp_xxx_Delete]' -SqlInstance xxxx\PROD\ -Database RLBCAM -verbose -QueryTimeout 1200" 

SQL:

BEGIN TRY
    WHILE @FETCH_STATUS  <= @ID 
    BEGIN 
        SET @Tab = (SELET Tabelle FROM @Basis WHERE ID = @FETCH_STATUS) 
        SET @Quelle = (SELET P2 FROM @Basis WHERE ID = @FETCH_STATUS) 
        SET @Wert = (SELECT Wert FROM @Basis WHERE ID = @FETCH_STATUS) 
        SET @Zieldate = (SELET Basisdate FROM @Basis WHERE ID = @FETCH_STATUS) 

        IF @Tab <> '' 
        BEGIN
            WHILE 1 = 1 
            BEGIN 
                SET @x = CONCAT('DELETE TOP(50000) FROM ',@Tab,' WHERE ',@Quelle ,' = ', nchar(39), @Zieldate, nchar(39))           
                EXEC (@x) 
                
                IF @@ROWCOUNT = 0 
                    BREAK 
                WAITFOR DELAY '00:00:01' 
            END                         

            SET @x = REPLACE(@x, 'TOP(50000)', '*') 
            EXECUTE bas.proc_WriteLog 'bas.SP.xxxxx_Delete', 0, 'I', @x, 0, '', @Date1, @VDate, 'Delete ...' 
        END 
        ELSE
        BEGIN
            PRINT CONCAT('Dead ID:', @FETCH_STATUS) 
        END

        SET @FETCH_STATUS = @FETCH_STATUS + 1 
    END
END TRY

它最终因超时而失败

详细:从 bas.tbl_xxxx 中删除 Top(50000),其中 source = '2020-08-11' 详细
:从 bas.tbl_xxxx 中删除 Top(50000),其中 source = '2020-08-11'
警告:[11:38:03 ][Invoke-DbaQuery] [] 执行失败 | 等待操作超时

在 SQL Server Management Studio 中启动时,存储过程不会因超时而失败。

执行此存储过程时没有其他作业正在运行。使用 shell 时,它总是在大约 5 分钟后失败。

DELETE 语句在每个数据日删除 50000 个包中的大约 2 个 mio 记录。完整的作业将从几个表中删除大约 50 条 mio 记录,没有连接,总是相同的语句,其他日期和表名。Packagesize 50000 对所有语句都有效。

使用较小的大小(例如 10000 或更长的超时时间)时没有区别。最大超时为 20 小时,效果相同。

内存峰值为 350 MB。系统提供 128 GB 内存。磁盘存储空间 > 1 TB。

SQL Server 2019

MMC 2018,对服务器版本有效

标签: sqlsql-server

解决方案


推荐阅读