我在两台不同的机器(开发者机器和测试机器)上恢复了数据库,虽然不相同但它们具有相似的性能。
使用以下查询(混淆):
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+ %
。
但两者的执行计划是一样的......
任何人都可以建议为什么会这样,以及可能的优化?
答案 0 :(得分:2)
有一点我可以看到'可能'对性能产生影响的是GETDATE()
函数的使用,可能会为每条记录调用两次,但肯定会一次,因此400K调用该函数!
我会将GETDATE()
的结果放入一个变量并使用它,除非有一个非常好的理由,否则我总是这样做,例如整个查询中的日期更改需要像批处理一样在CURSOR
内处理。
但是,我怀疑这将是性能的主要问题。由于执行计划相同的不同机器之间的执行时间差异很大,我会考虑SQL之外的因素,如CPU使用率,HDD使用率,速度和碎片等。