如何在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
相关产品推荐
相关产品推荐

