这个问题来自一位开发人员,因此可能比较简单。
我们有一台开发和生产 sqlserver(2000),我怀疑生产服务器上的磁盘写入时间非常慢。我做了以下 t-sql 测试
测试 1:10k 插入,在开发上花费 2 秒,在生产上花费 63 秒
if object_id('testD') is not null drop table testD
create table testD (i integer)
declare @i int
set @i=1
while @i <= 10000
begin
insert into testD (i) values (@i)
set @i = @i+1
end
测试 2:删除 5000 条数据,两台服务器均无时间
delete from testD where i >= 5000
测试 3:嵌套循环,开发环境 2 秒,生产环境 5 秒
select count(A.i + B.i)
from testD A
, testD B
这些测试是在非工作时间进行的,而我总是得到相同的结果。我是一名开发人员,所以我只能通过 SQLServer 访问服务器。从这些测试中可以得出什么结论(如果有的话),我应该向技术支持部门询问什么样的问题?
答案1
每台服务器都配有哪种磁盘子系统?在运行测试时,如果不了解服务器的更多信息以及服务器上发生的情况,那么现在真的无法确定问题出在哪里。
乍一看,这听起来像是磁盘子系统有问题,但这可能会产生误导。
CPU 可能忙于运行压缩备份。如果磁盘位于 SAN 上,并且与文件服务器使用共享存储,则文件服务器可能正在执行夜间碎片整理操作。SQL Server 可能正在重建此数据库或服务器上另一个数据库中的所有索引,这些操作占用了所有磁盘资源。
如果没有更多访问 SQL Server 的权限,您将无法找出问题所在。向支持团队报告问题,并确保他们确实跟进。如果您的支持团队很优秀,他们应该已经意识到这个问题并正在努力解决它。
答案2
生产服务器上还有多少其他事情发生?
在您的开发箱中,您可能是唯一的活跃用户,因此请获取所有可用于查询的资源,但在生产箱中,您的数据库和/或该服务器上的其他数据库上可能会进行大量活动查询,因此存在 IO 带宽争用。
答案3
我提到仔细查看磁盘或磁盘子系统以及 mdf 和 ldf 文件的碎片。
另一方面,可能是 sql-server 索引碎片降低了性能,或者统计数据完全不同,实际上 dev-db 上只有几行,而 pred-db 上的行数要多得多。尝试将统计数据从 prod-server 转移到 dev-server 以获得相同的执行计划。
最后但并非最不重要的是,看看(它怎么称呼的)备份级别:如果它是“完整”,那么所有内容都会进入事务日志 (*.ldf),如果它是“简单”,则不会将任何内容写入事务日志。所以我敢打赌你的开发系统配置了简单模式,而你的生产系统驱动完整模式。
最后,如果您在本地电脑上有一个管理工作室(查询分析器),可以通过网络访问服务器。那么您的开发服务器的带宽可能会更好,例如 1 GBit,而生产服务器的带宽只有 100MBit。
不要看光明在哪里,真理就在黑暗中......
和平
冰