我如何知道为什么我的查询运行得这么慢?

我如何知道为什么我的查询运行得这么慢?

我有一个查询比平时花费了更长的时间,并且我无法判断它是否卡住了。

查询如下:

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 的增强版,应该能为您提供所需的所有信息。

http://sqlblog.com/files/folders/beta/entry27502.aspx

相关内容