如何获取带循环查询的整体时间统计并对比SHA2-256与SHA2-512哈希性能
解决你的SQL时间统计与SHA2哈希性能对比问题
一、如何统计包含循环的整个SQL查询的总耗时
你之前用SET STATISTICS TIME ON的方式,可能会因为SQL Server的统计输出逻辑,让你误以为是每个循环的独立时间——其实它输出的是整个批处理的累计时间,但有时候会夹杂其他系统开销的信息,不太直观。更靠谱的方式是手动记录循环的起始和结束时间,直接计算总耗时,精度也更高。
试试这个修改后的脚本:
-- 记录循环开始时间(用SYSDATETIME精度到微秒,比GETDATE更准确) DECLARE @StartTime DATETIME2 = SYSDATETIME(); DECLARE @Counter INT = 0; DECLARE @Result nvarchar(4000); DECLARE @HashThis nvarchar(4000); SET @HashThis = CONVERT(nvarchar(4000),'Some dummy text.'); WHILE @Counter <= 10000 BEGIN SET @Result = HASHBYTES('SHA2_256', @HashThis); SET @Counter = @Counter +1; END -- 计算并打印总耗时 DECLARE @EndTime DATETIME2 = SYSDATETIME(); SELECT DATEDIFF(MILLISECOND, @StartTime, @EndTime) AS TotalExecutionTimeMs, DATEDIFF(MICROSECOND, @StartTime, @EndTime) AS TotalExecutionTimeMicroSec; -- 如果还是想用SET STATISTICS TIME,记得把整个逻辑放在一个批处理里(去掉中间的GO) /* SET STATISTICS TIME ON; DECLARE @Counter INT = 0; DECLARE @Result nvarchar(4000); DECLARE @HashThis nvarchar(4000); SET @HashThis = CONVERT(nvarchar(4000),'Some dummy text.'); WHILE @Counter <= 10000 BEGIN SET @Result = HASHBYTES('SHA2_256', @HashThis); SET @Counter = @Counter +1; END SET STATISTICS TIME OFF; */
简单解释下:
SYSDATETIME()的精度到微秒,能更精准地捕捉时间点- 循环结束后直接计算时间差,得到的就是整个循环的纯耗时,不会被系统其他统计信息干扰
- 要是坚持用
SET STATISTICS TIME,一定要去掉中间的GO,让整个循环逻辑属于同一个批处理,这样输出的就是循环的累计CPU和执行时间,而非拆分的片段
二、对比SHA2_256与SHA2_512的哈希性能
要公平对比两者的性能,得控制变量:用相同的输入文本、相同的循环次数,分别统计各自的耗时。这里给你两种实用的测试方式:
方式1:手动计时直观对比
-- 先测试SHA2_256 DECLARE @StartTime256 DATETIME2 = SYSDATETIME(); DECLARE @Counter256 INT = 0; DECLARE @Result256 varbinary(32); -- SHA2_256的结果固定是32字节 DECLARE @HashText nvarchar(4000) = CONVERT(nvarchar(4000),'Some dummy text.'); WHILE @Counter256 <= 100000 -- 增加循环次数,让性能差异更明显 BEGIN SET @Result256 = HASHBYTES('SHA2_256', @HashText); SET @Counter256 = @Counter256 +1; END DECLARE @EndTime256 DATETIME2 = SYSDATETIME(); -- 再测试SHA2_512 DECLARE @StartTime512 DATETIME2 = SYSDATETIME(); DECLARE @Counter512 INT = 0; DECLARE @Result512 varbinary(64); -- SHA2_512的结果固定是64字节 WHILE @Counter512 <= 100000 BEGIN SET @Result512 = HASHBYTES('SHA2_512', @HashText); SET @Counter512 = @Counter512 +1; END DECLARE @EndTime512 DATETIME2 = SYSDATETIME(); -- 输出对比结果 SELECT 'SHA2_256' AS HashAlgorithm, DATEDIFF(MILLISECOND, @StartTime256, @EndTime256) AS TotalMs, DATEDIFF(MICROSECOND, @StartTime256, @EndTime256) AS TotalMicroSec UNION ALL SELECT 'SHA2_512' AS HashAlgorithm, DATEDIFF(MILLISECOND, @StartTime512, @EndTime512) AS TotalMs, DATEDIFF(MICROSECOND, @StartTime512, @EndTime512) AS TotalMicroSec;
方式2:用SET STATISTICS TIME看CPU开销
-- 测试SHA2_256 SET STATISTICS TIME ON; DECLARE @Counter256 INT = 0; DECLARE @Result256 varbinary(32); DECLARE @HashText nvarchar(4000) = CONVERT(nvarchar(4000),'Some dummy text.'); WHILE @Counter256 <= 100000 BEGIN SET @Result256 = HASHBYTES('SHA2_256', @HashText); SET @Counter256 = @Counter256 +1; END SET STATISTICS TIME OFF; GO -- 测试SHA2_512 SET STATISTICS TIME ON; DECLARE @Counter512 INT = 0; DECLARE @Result512 varbinary(64); DECLARE @HashText nvarchar(4000) = CONVERT(nvarchar(4000),'Some dummy text.'); WHILE @Counter512 <= 100000 BEGIN SET @Result512 = HASHBYTES('SHA2_512', @HashText); SET @Counter512 = @Counter512 +1; END SET STATISTICS TIME OFF;
执行后去“消息”窗口看CPU时间和执行时间就行——通常SHA2_512的CPU开销会略高,但现代服务器如果有SHA2硬件加速的话,差异可能很小。
测试小提示
- 建议多次测试取平均值,避免单次测试的偶然性
- 循环次数尽量设大些(比如10万次以上),性能差异会更明显
- 测试时尽量让服务器处于低负载状态,避免其他任务干扰结果
内容的提问来源于stack exchange,提问作者Stanislav Jirak
相关产品推荐
相关产品推荐

