环境:
我们有两台运行 SQL Server 2005 的 32 位 Windows Server 2003 R2 机器。硬件配置是相同的服务器,具有 Xeon 5160 CPU、4GB RAM 和 13GB RAID0。未启用 AWE 和 /3GB 标志。
服务器是使用预定义的安装清单并排设置的,并且两台机器上安装的所有软件都是相同的。
我们知道要检查的每个 SQL 服务器安装设置和补丁级别都是相同的。一个区别是 TEMPDB 在快速机器上为 400MB,而在慢速机器上为 1.2GB。但是,在这两种情况下,我们都没有看到任何 TEMPDB 分配发生。
问题:
有一个存储过程,一个运行 2 秒,另一个运行 15 分钟。在额外的 15 分钟内,几乎没有磁盘活动,也没有内存使用变化,但一个 CPU 内核始终保持 100% 固定。
即使从一个数据库备份并恢复到另一个数据库,这种行为仍然存在。
由于它是一个存储过程,因此活动监视器和分析器不会向我们显示有关此高 CPU 活动在存储过程中的何处发生的任何详细信息。
问题:
我们还应该看什么?
跟进:
缓慢发生在以下游标定义的 FETCH NEXT 语句中:
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
... …Run Code Online (Sandbox Code Playgroud)