为了创建一个大的测试数据库,我创建了一个 SP,它使用预定义的表列表(我感兴趣的 35 个)并将每个表中的数据相乘。
换句话说,一张表有一个商店的数据。我在这个表中插入了相同的数据,但使用了不同的商店编号(这给了我 2 个商店)。然后,我调用同一个 SP,将 2 个存储数据乘以 4 个存储,依此类推。周末我开始了 SP 的 6 个后续调用的过程,认为当我星期一回来时我的数据库将有 64 个商店的数据。不幸的是,事实并非如此……
周一来的时候,发现数据HD已经满了,但是进程没有崩溃,好像挂了。我的数据库处于简单恢复模式,我通过移动文件和缩小 TempDB(通过 SSMS 中的缩小文件选项)来腾出空间,并在外部驱动器上创建了一个初始大小为 100GB 的额外 ndf 文件......该过程仍在运行(腾出空间后超过 24 小时)。
spid 的任务状态显示暂停,等待类型为 PAGEIOLATCH_EX,但等待时间很短(低于 100 毫秒),这让我相信该进程仍在运行。
35 个表中有 34 个表大小合适并且乘法速度足够快...该过程已将所有表中的 1 个数据存储乘以 8 个存储,并且仍在完成从 8 个存储到 16 个存储的数据乘法...它似乎正在处理的一张桌子是所有桌子中最大的...
将该表的数据从 8 个存储增加到 16 个的实际过程是从 4 亿条记录中插入 4 亿条记录,该表有 200 列所有不同类型。
我在浪费时间等待吗?恐怕杀死进程需要几天时间才能回滚......我应该等待它吗?它变成了幻影进程吗?我怎么知道它在做什么?
任何意见/想法将不胜感激。
谢谢
如果您还没有Adam Machanic
sp_whoisactive
编写的存储过程,请下载它。使用选项执行。@get_full_inner_text = 0
从存储过程的注释部分:
运行此查询,您应该会看到实际运行的语句和打开的会话活动: