我们有一个 ETL 工作,有时会陷入困境。
在这种情况下,我查看了 sp_who2,发现没有阻塞,而且它是系统上唯一的活动查询。
以下是来自 sysprocesses 的转储:
spid kpid blocked waittype waittime lastwaittype waitresource dbid uid cpu physical_io memusage login_time last_batch ecid open_tran status cmd
61 6276 0 0x00BB 3659611 CXPACKET 5 9 184826204 114737 2 35:53.8 35:53.8 0 2 suspended INSERT
61 6540 0 0x0000 0 SOS_SCHEDULER_YIELD 5 9 3503094 513 0 35:53.8 35:53.8 2 0 runnable INSERT
61 360 0 0x0000 0 SOS_SCHEDULER_YIELD 5 9 3377297 420 0 35:53.8 35:53.8 4 0 runnable INSERT
61 4348 0 0x0000 0 SOS_SCHEDULER_YIELD 5 9 3446657 515 0 35:53.8 35:53.8 3 0 runnable INSERT
61 5532 0 0x0000 0 SOS_SCHEDULER_YIELD 5 9 3094360 443 0 35:53.8 35:53.8 5 0 runnable INSERT
我怀疑查询正在并行进行并阻止自身,因为所有活动都发生在同一个 spid 上。但我不知道如何进一步排除故障。
对这里发生的事情有什么想法吗?或者如果再次发生这种情况我可以采取哪些其他步骤来解决问题?
答案1
块类型 00BB 为 CXPACKET,这意味着数据库正在等待另一个线程完成。其他 4 个线程正在运行,因为它们没有显示等待类型。最后一个等待类型显示的 SOS_SCHEDULER_YIELD 意味着 SQL Server 正在取消调度线程,因为它还有其他更容易完成的事情要做,所以它首先处理这些事情。
您需要调整查询,因为您可能遇到某种需要解决的索引问题。