环境:
我们有两台运行SQL Server 2005的32位Windows Server 2003 R2计算机。硬件配置是具有Xeon 5160 CPU,4GB RAM和13GB RAID0的相同服务器。未启用AWE和/ 3GB标志。
使用预定义的安装清单并排设置服务器,并且两台计算机上所有已安装的软件均相同。
我们知道要检查的每个SQL Server安装设置和补丁程序级别都是相同的。一个区别是,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
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...
每个FETCH语句(在仅包含约1000行的表上)需要约7.25分钟。(不,我不知道为什么要连续执行两个操作,需要询问开发人员,但是它确实可以在两个服务器上正常运行)。
我有点怀疑“ NOT IN(SELECT ...)”,因为看起来“虚拟读取”的确很高。