我有一个相当复杂的程序,目前需要大约1:30(分:秒)才能完成。我们正在转换到新服务器,当我对新服务器上的相同数据运行相同的查询时,几乎需要2:30完成。
旧服务器是单一的proc - 双核Intel 4 2.8 GHz CPU,带有3 GIG RAM,运行Windows 2000和SQL 8.新服务器是双进程 - 双核(总共4核)3.4 GHz机器,6运行Windows 2008 R2和SQL 2008的RAM的GIG。
我原本希望看到这个程序(每小时频繁运行)使用新机器和新SQL加快速度但现在速度慢了50%以上?!我在一家小公司工作,完成所有的编程和网络,但我不是DBA。是否可能在旧机器/ SQL上进行某种优化,而新机器/ SQL上没有这种优化?除了运行已设置为使用所有可用RAM的SQL之外,新机器什么都不做。
当我运行程序时,它似乎只使用一个处理器核心和它可以获得的所有RAM(在两台机器上都相同)。并且它似乎只使用一个处理器平均约50%。
对于可能导致这种放缓的指导,我们表示赞赏。
布赖恩
答案 0 :(得分:4)
我假设您通过执行还原来升级数据库,更新统计信息(使用完全扫描)还是重建所有索引? 否则你将无法获得最佳计划
进行全面扫描,你可以这样做
EXEC sp_msForEachTable 'UPDATE STATISTICS ? WITH FULLSCAN'
如果您有大表
,这可能需要一段时间答案 1 :(得分:2)
可能的问题是您的SQL Server对存储过程的查询计划错误。
以下是一些解决问题的常用方法:
Optimize for Unknown - 告诉您的SQL Server,对于此存储过程,它应该始终确定要使用的查询计划 - 它不会使用历史信息。这通常会导致更一致的运行时间。
Prevent Parameter Sniffing - 有时SQL Server会查看您的参数并转向特定的查询计划。有时候这是非常不受欢迎的,可以采用速度非常快的SPROC并将其变成一个多分钟的庞然大物。通过重新声明和复制所有参数,这将成为一个无问题。
您还应该清除统计信息
EXEC sp_MSForEachTable 'Update Statistics ''?'' with FULLSCAN'
答案 2 :(得分:1)
如果更新统计信息和其他数据库更改没有帮助,请检查服务器本身。
新服务器是否只有一个驱动器,旧服务器是否分为多个驱动器?
新硬盘驱动器的速度是否慢于旧硬盘驱动器?
是否在新服务器上启用了病毒扫描?
查找其他服务器配置问题。