tsql 进程永远运行......它在做什么

Joh*_*hnG 3 sql-server t-sql activity-monitor wait-types

尝试创建一个大型测试数据库时,我创建了一个 SP,它使用预定义的表列表(我感兴趣的 35 个)并将每个表中的数据相乘。

换句话说,一张表有一个商店的数据。我将相同的数据插入到该表中,但具有不同的商店编号(这给了我 2 个商店)。然后我调用将 2 个商店数据乘以 4 个商店的同一个 SP,依此类推。上周末,我开始对 SP 进行 6 次后续调用,认为当我周一回来时,我的数据库将拥有 64 家商店的数据。不幸的是,事实并非如此......

当我周一来时,我发现数据高清已满,但该过程从未崩溃并且似乎已暂停。我的数据库处于简单恢复模式,我通过移动文件和缩小 TempDB(通过 SSMS 中的缩小文件选项)来腾出空间,并在外部驱动器上创建了一个初始大小为 100GB 的额外 ndf 文件......进程仍在运行(腾出空间后超过 24 小时)。

spid 的任务状态显示暂停,等待类型为 PAGEIOLATCH_EX,但等待时间很短(低于 100 毫秒),这让我相信进程仍在运行。

35 个表中有 34 个大小合适,乘法速度足够快... 该过程已将所有表中的 1 个数据存储乘以 8 个存储,并且仍在完成数据从 8 个存储到 16 个存储的乘法过程......它似乎正在处理的一张桌子是所有桌子中最大的......

将这个表的 8 个存储区的数据乘以 16 个存储区的实际过程是从 4 亿条记录中插入 4 亿条记录,该表有 200 列所有不同类型。

我是在浪费时间等待吗?恐怕杀死进程需要几天时间才能回滚......我应该等待吗?它变成了一个 Phantom 过程吗?我怎么知道它在做什么?

任何意见/想法将不胜感激。

谢谢

Sql*_*ide 5

如果您还没有,请下载Adam Machanicsp_whoisactive编写的存储过程。使用选项执行。@get_full_inner_text = 0

从存储过程的注释部分:

--如果为1,则获取完整的存储过程或正在运行的批处理,如果可用
--如果为0,则仅获取当前在批处理或过程中运行的实际语句
@get_full_inner_text = 0