You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取带循环查询的整体时间统计并对比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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:00:44