【问题标题】:Get duration of executing script in SQl Server 2008 R2获取在 SQl Server 2008 R2 中执行脚本的持续时间
【发布时间】:2023-03-03 06:09:22
【问题描述】:

我有一个脚本要执行,需要执行时间,我该如何计算?

我想用这种方式:

DECLARE @startTime DATETIME
SET @startTime = GETDATE();

--Script


DECLARE @endTime DATETIME
SET @endTime = GETDATE();

PRINT 'Transfer Duration:';
GO
PRINT CONVERT(varchar,@endTime-@startTime,14);
GO

但是因为我使用GO(而且我必须这样做)所以出现了错误,那么您对计算和打印执行脚本的持续时间有什么建议(使用Go)?

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2


    【解决方案1】:

    使用表格来存储开始和结束时间,同时输入您的进程 ID。然后使用 DATEDIFF() 计算经过的时间。

        CREATE TABLE Profiling(
                spid            smallint        NOT NULL,
                StartTime       DATETIME2       NOT NULL,
                EndTime         DATETIME2
        )
    
        INSERT INTO Profiling(spid, StartTime)
        SELECT @@SPID, CURRENT_TIMESTAMP
        GO
    
        -- your queries come here
        -- .....
    
        UPDATE Profiling
        SET EndTime = CURRENT_TIMESTAMP
        WHERE spid = @@SPID
        GO
    
        SELECT DATEDIFF(MS, startTime, EndTime) as MilliSeconds
        FROM Profiling
        WHERE spid = @@SPID
    

    不时截断表,以避免 spid 的冲突。

    【讨论】:

    • 语法无效。你的临时变量在你写 'go' 时就死了
    • “无效语法”?你在什么 RDBMS 上得到的?它在 SQL Server 2005 上完美运行。“你的临时变量”??上面的代码中根本没有使用单个(临时)变量! @@SPID 是 Tranact-SQL 函数的构建,而不是变量。请停止拖钓。
    • 抱歉,我测试了类似的东西失败了,你的脚本工作正常
    【解决方案2】:

    查看SET STATISTICS TIME 声明。

    【讨论】:

    • 感谢您的回答,但是STATISTIC Time 计算由GO 分隔的任何一批命令的时间,实际上通过这种方式我的脚本执行时间翻了一番,而且我只需要一个持续时间对于所有脚本。
    【解决方案3】:
    Go
    DECLARE @startTime DATETIME
    SET @startTime = GETDATE();
    
    -- your sql statement
    
    DECLARE @endTime DATETIME
    SET @endTime = GETDATE();
    
    PRINT 'Transfer Duration:';
    
    PRINT cast((@endTime-@startTime) AS TIME);
    Go
    

    或者更准确地说,您可以使用SET STATISTICS TIME,它显示解析、编译和执行每条语句所需的毫秒数。

    【讨论】:

    • 由于 DATETIME 的准确度只有 3.33 毫秒,所以我认为这并不是非常准确且非常有用,我认为..... SQL Server 2008 将具有 DATETIME2 的准确度100ns - 可能更有用(PS:我没有投反对票 - 只是想指出你推荐的解决方案的缺点)
    • @Viswanathan Iyer 谢谢你的回答,但在主要问题中我强调我必须使用GO 命令,
    • @Saeid Go 在查询结束时检查它现在我已经编辑了我的答案。
    • @Viswanathan Iyer 我的意思是在我的脚本之间使用GO,而不是在它的末尾。
    • @Saeid 您可以在脚本的开头和结尾使用 Go,现在我已经编辑了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多