我有一个查询比平时花费了更长的时间,并且我无法判断它是否卡住了。
查询如下:
INSERT XXXXXX WITH (TABLOCK)
SELECT * FROM YYYYYY with (NOLOCK)
WHERE ZZZZZZZZ = 1
这将插入数亿行。我在 ZZZZZZZZ 上有一个索引。
没有阻塞会话。当我检查 sys.dm_exec_requests 时,它显示最后一个等待类型是页面锁定 我不确定这是什么意思,只是它与 I/O 有关。
sys.dm_exec_sessions 显示状态为 RUNNING,但 sp_who2 显示其为 SUSPENDED。
我试图查看表是否在增长,但是当我调用 sp_spaceused XXXXXX 时,我一直得到相同的值。
我还可以做些什么?
更新:
借助以下答案堆栈溢出,我发现有I/O 问题,我的查询平均每分钟插入约 600 条记录)。
我下一步要做什么?
在我开始假设我的磁盘出现问题之前我该做什么?
答案1
查询正在运行,在执行大量插入时,PAGEIOLATCH_SH 很常见,因为它需要等待磁盘子系统。索引实际上阻碍了性能,因为索引会在表的每次插入中插入一个。
数亿条记录很多,需要一些时间,它已经运行多长时间了?
答案2
如果您使用的是 2005 或 2008,我肯定会运行由 SQL MVP Adam Mechanic 开发的 sp_whoisactive 脚本。它基本上是 sp_who/sp_who2 的增强版,应该能为您提供所需的所有信息。