简单更新查询的性能不同

时间:2014-06-26 13:00:11

标签: sql-server tsql

我在两台不同的机器(开发者机器和测试机器)上恢复了数据库,虽然不相同但它们具有相似的性能。

使用以下查询(混淆):

 CREATE TABLE #TmpTable (MapID int, Primary key(MapID))

 UPDATE MapTable
    SET Tstamp = GetDate() 
   FROM MapTable    
        JOIN Territory as Territory ON Territory.ID = MapTable.TerritoryID
        LEFT JOIN #TmpTable ON #TmpTable.MapID = MapTable.MapID  
  WHERE MapTable.TStamp > DateAdd(year, -100, GETDATE())    
    AND Territory.Name IS NOT null    
    AND Territory.Name NOT LIKE '!%'   
    AND #TmpTable.MapID IS NULL

对于400k条记录,开发人员计算机会在大约4秒内更新,但在测试计算机上,它会在大约25秒内更新;两台机器都恢复了相同的数据库。

问题在于,当我们使用的工具运行时,查询超时设置为30秒,测试机上的时间超时90+ %

但两者的执行计划是一样的......

任何人都可以建议为什么会这样,以及可能的优化?

1 个答案:

答案 0 :(得分:2)

有一点我可以看到'可能'对性能产生影响的是GETDATE()函数的使用,可能会为每条记录调用两次,但肯定会一次,因此400K调用该函数!

我会将GETDATE()的结果放入一个变量并使用它,除非有一个非常好的理由,否则我总是这样做,例如整个查询中的日期更改需要像批处理一样在CURSOR内处理。

但是,我怀疑这将是性能的主要问题。由于执行计划相同的不同机器之间的执行时间差异很大,我会考虑SQL之外的因素,如CPU使用率,HDD使用率,速度和碎片等。