SQL Server跨服务器性能差异排查:求通用性能对比测试SQL
我完全理解你遇到的这种困惑——相同的逻辑、相同的数据,却跑出天差地别的性能,确实让人摸不着头脑。下面我给你一套不依赖现有业务数据的通用性能测试脚本,用来对比两台SQL Server服务器的基础DML(插入、更新)性能,你可以在两台机器上完全同步执行,就能看出核心性能差异:
通用SQL Server性能对比测试脚本
第一步:创建测试表(确保环境干净)
先清理可能存在的旧测试表,再创建一个结构贴近真实业务的测试表:
-- 清理旧表(如果存在) DROP TABLE IF EXISTS dbo.PerformanceTestTable; -- 创建测试表 CREATE TABLE dbo.PerformanceTestTable ( ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, -- 聚集主键,模拟常用的自增ID RandomVarchar VARCHAR(50) NOT NULL, RandomInt INT NOT NULL, RandomDate DATETIME NOT NULL, UpdateFlag BIT DEFAULT 0, CalculatedValue DECIMAL(18,2) NULL );
第二步:批量插入500万条测试数据
用高效的批量插入方式生成模拟数据,避免逐行插入的低效:
-- 开启时间统计 SET STATISTICS TIME ON; SET NOCOUNT ON; DECLARE @StartTime DATETIME = GETDATE(); -- 批量插入500万条数据(利用系统表快速生成行) INSERT INTO dbo.PerformanceTestTable (RandomVarchar, RandomInt, RandomDate) SELECT 'TestString_' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS VARCHAR(10)), ABS(CHECKSUM(NEWID())) % 10000, DATEADD(MINUTE, -ABS(CHECKSUM(NEWID())) % 525600, GETDATE()) -- 生成近1年的随机日期 FROM master.dbo.spt_values v1 CROSS JOIN master.dbo.spt_values v2 WHERE v1.type = 'P' AND v2.type = 'P' AND ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) <= 5000000; -- 输出插入耗时 SELECT '插入500万行耗时:' + CAST(DATEDIFF(SECOND, @StartTime, GETDATE()) AS VARCHAR(10)) + ' 秒'; SET STATISTICS TIME OFF;
第三步:大规模批量更新测试
模拟真实场景中的批量更新操作,比如基于字段计算更新、范围更新:
SET STATISTICS TIME ON; SET NOCOUNT ON; DECLARE @UpdateStartTime DATETIME = GETDATE(); -- 批量更新:根据RandomInt计算CalculatedValue,并标记UpdateFlag为1 UPDATE dbo.PerformanceTestTable SET CalculatedValue = RandomInt * 1.75, UpdateFlag = 1 WHERE RandomInt BETWEEN 1000 AND 9000; -- 覆盖大部分数据(约80%的行) -- 输出更新耗时 SELECT '批量更新耗时:' + CAST(DATEDIFF(SECOND, @UpdateStartTime, GETDATE()) AS VARCHAR(10)) + ' 秒'; SET STATISTICS TIME OFF;
测试注意事项
- 确保两台服务器都在相同的负载环境下执行:关闭非必要的服务、进程,避开业务高峰时段。
- 执行前可以先清空缓存(谨慎操作,仅在测试环境执行):
DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; - 可以多次执行取平均值,避免单次测试的偶然性。
通过这套脚本,你就能直观对比两台服务器在批量插入、大规模更新上的基础性能差异,帮助定位是CPU、内存、存储还是配置层面的问题。
内容的提问来源于stack exchange,提问作者user3266033
相关产品推荐
相关产品推荐

