我认为我要问的问题通常属于“不良实践”的范围,但无论如何我都想问,因为此功能对于诊断问题和对长时间运行的脚本进行基准测试非常有用。
简而言之,SQL Server 中是否有一个我可以调用的内置函数,可以让我“暂停”一小段时间?
我有一个每晚的 SSIS 流程,在导出数据后会生成各种统计数据子集。每当我在 SSIS 包的执行时间方面遇到问题时,我都可以调用一系列诊断存储过程来帮助诊断哪些导出/批量插入执行时间异常长。
在我的 SSIS 流程的后半部分,我会生成统计数据,如果我能够分析该流程可能陷入困境的位置或分析它修改数据表中数据的速度,那将非常有益。大多数静态过程首先将数据插入到表中,该表通过 WHILE 循环进行循环,并在满足必要条件时进行更新。
在执行统计存储过程时,我可以轻松查询数据以捕获特定指标。我想要做的是获取该指标,等待 1 秒(或某个特定的时间),然后再次获取该指标,以便我可以比较它们。
通过实现“暂停”,我可以创建更强大的诊断脚本,输出每秒开始执行的插入、更新或计算次数,从而可以估计较大程序的哪些部分花费的时间最长。
我假设我可以在 SQL Server Management Studio 中使用一些诊断工具。我承认,我没有对这些进行任何修改。然而,通常如果 SSMS 中有一个工具,大部分后端功能都可以通过某种形式的花哨脚本来模仿。使用任何内置诊断的另一个可能的限制是,我更喜欢在 SSIS 包运行时运行这些指标,而不仅仅是在测试包内执行的存储过程时。
感谢大家提供任何解决方案或提示!这个请求并不是 100% 必要的,但我的夜间 SSIS 包变得越来越大,我不得不开始微调我过去一直忽略的“吱吱作响的轮子”。
也许您正在寻找等待延迟
您可以使用 WAITFOR DELAY 语句
选择获取日期() -- 等待 10 秒再运行另一个命令
等待延迟“00:00:10”; --接受值 hh:mm:ss
选择获取日期()
这是一个很好的解决方案。
CREATE OR ALTER FUNCTION [dbo].[Sleep](@seconds INT)
RETURNS INT AS
BEGIN
DECLARE @startTime DATETIME2(7) = SYSDATETIME();
DECLARE @endTime DATETIME2(7) = DATEADD(SECOND, @seconds, @startTime);
WHILE (SYSDATETIME() < @endTime)
SET @startTime = @startTime;
RETURN @seconds;
END
GO
CREATE OR ALTER VIEW dbo.SlowView AS
SELECT
[dbo].[Sleep](5) AS DELAY,
NEWID() AS VALUE
GO
SELECT * FROM SlowView