You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中追踪GO命令的执行次数?

批量删除进度追踪方案

由于GO是SSMS/SQLCMD这类客户端工具的命令,并非SQL Server引擎原生支持的语句,所以没有所谓的“未公开内置方法”来直接追踪它的循环执行进度,不过可以通过以下几种实用方式实现进度监控:

1. 自定义进度记录表

先创建一个临时表(或永久表,跨会话可用)来记录每批删除的完成情况:

-- 创建临时进度表(仅当前会话可见)
CREATE TABLE #PurgeProgress (BatchID INT IDENTITY(1,1), CompletedTime DATETIME DEFAULT GETDATE(), RowsDeleted INT)

然后修改你的删除语句,每执行一批就插入进度数据:

DELETE FROM v_DataToBePurged_FOD;
INSERT INTO #PurgeProgress (RowsDeleted) VALUES (@@ROWCOUNT);
GO 500000000

之后在另一个查询窗口里,随时查询进度:

-- 查看已完成批次数、总删除行数、最近一次批处理时间
SELECT 
    COUNT(*) AS CompletedBatches,
    SUM(RowsDeleted) AS TotalRowsDeleted,
    MAX(CompletedTime) AS LastBatchTime
FROM #PurgeProgress

-- 同时可以查询原表剩余待删除行数,对比进度
SELECT COUNT(*) AS RemainingRowsToPurge 
FROM YourOriginalTable 
WHERE [你的清理条件] -- 和索引视图v_DataToBePurged_FOD的过滤条件一致

2. 利用动态管理视图(DMV)追踪会话执行情况

通过DMV可以查看当前执行删除操作的会话状态,以及已完成的批处理统计:

-- 先找到执行清理的会话ID(替换为你的登录名或其他标识)
SELECT session_id, login_name, status 
FROM sys.dm_exec_sessions 
WHERE login_name = 'YourLoginName'

-- 用找到的session_id替换下面的@SessionID,查看已完成批次数
DECLARE @SessionID INT = 52 -- 替换为实际会话ID
SELECT 
    r.command,
    r.status,
    COUNT(qs.statement_start_offset) AS CompletedBatches
FROM sys.dm_exec_requests r
LEFT JOIN sys.dm_exec_query_stats qs ON qs.session_id = r.session_id
WHERE r.session_id = @SessionID
GROUP BY r.command, r.status

注意:这个方法的统计依赖SQL Server的查询计划缓存,可能存在少量误差,但可以作为快速参考。

3. 用SQLCMD模式输出日志到文件

在SSMS中切换到SQLCMD模式(工具栏→查询→SQLCMD模式),执行以下语句将每批执行结果输出到日志文件,之后可以实时查看文件内容追踪进度:

-- 输出日志到指定文件
:OUT C:\Temp\PurgeProgress.log

DELETE FROM v_DataToBePurged_FOD;
-- 打印每批的完成时间和删除行数
PRINT '[' + CONVERT(VARCHAR, GETDATE(), 120) + '] Batch completed, Rows deleted: ' + CONVERT(VARCHAR, @@ROWCOUNT)
GO 500000000

你可以用记事本、Notepad++等工具实时打开日志文件,统计已完成的批次数,或者累加删除的总行数。

内容的提问来源于stack exchange,提问作者e-Fungus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:18:21