如何获得SQL Server存储过程的准确计时?

时间:2016-04-13 23:24:43

标签: sql-server stored-procedures benchmarking

我正在计算使用原始数据库和快照之间的区别。 我可以使用这个例程计时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中,但我没有看到任何方向上的任何解决方案都没有增加大量的随机开销。

如何捕获或忽略结果,以便它们不显示?

2 个答案:

答案 0 :(得分:1)

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

Server side trace

Extended events

答案 1 :(得分:0)

您可能做的最好的事情是将结果插入表变量中。所以他们没有转移到客户端。当然,你必须在每次通话之间截断它。

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

另请参阅实际的查询执行计划。根据我的经验,无论哪个查询具有最低的逻辑磁盘读取通常是最快的。