如何获得 SQL 服务器存储过程的准确计时?

How do I get an accurate timing of a SQL Server stored procedure?

我正在计算使用原始数据库和快照之间的区别。 我可以使用此例程对 UDF 和视图计时:

DECLARE @Loops INT SET @Loops = 1 
DECLARE @CPU INT SET @CPU = @@CPU_BUSY 
DECLARE @StartDate DATETIME SET @StartDate = GETDATE()
DECLARE @SelectedValue int

WHILE @Loops <= 100 
BEGIN

    EXEC @SelectedValue = CashFlow.usp_CSF_Report_ProjectedExpendituresByFundingParticipant '7/1/1999'
    IF @SelectedValue = 50
            PRINT 1 
    SET @Loops = @Loops + 1   
END

PRINT 'usp_CSF_Report_ProjectedExpendituresByFundingParticipant' 
PRINT 'Total CPU time: ' + CONVERT(varchar, @@CPU_BUSY - @CPU)  
PRINT 'Total milliseconds: ' + CONVERT(varchar, DATEDIFF(ms, @StartDate, GETDATE())) 
PRINT ''   

但是当我 运行 它带有一个存储过程时,如图所示,我得到了结果集。

我担心显示结果所花费的时间会使计时结果无效。

尝试将其包装在视图或 UDF 中,但我没有看到任何不会增加大量随机开销的解决方案。

我如何捕捉或忽略结果而不显示它们?

您最多只能将结果插入 table 变量。所以他们不会转移给客户。当然,您必须在每次调用之间截断它。

话虽如此,如果您正在尝试进行性能调整,我会考虑使用 SET STATISTICS IO ON 和 SET STATISTICS TIME ON...这将告诉您逻辑磁盘读取次数和 CPU次。

另外看看实际的查询执行计划。以我的经验,逻辑磁盘读取最少的查询通常是最快的。

您可以使用服务器端跟踪或扩展事件。

Server side trace

Extended events