拥有一个持续运行的代理作业实例还是在一天中多次关闭作业更好?

J.D*_*.D. 1 sql-server sql-server-agent jobs sql-server-2016

我有一个 SQL 查询,我需要每秒运行大约 12 个小时。这是一个非常简单的查询,它将一些数据记录到一个孤立的表中。现在我一直让它在我的本地 SSMS 客户端中WHILE循环运行,并且我WAITFOR DELAY '00:00:01'习惯于在每次迭代之间暂停 1 秒。

如果我想将其移动到代理作业中,最好安排作业在这 12 小时内每 1 秒运行一次,还是保持查询原样并在早上启动一次作业,以便查询管理如何通常它会运行。(要记住的一件事是,查询通常足够快,以至于它的运行时间是亚秒级,但很少需要几秒钟才能完成执行。)

我想根本问题是,有一个连续运行 12 小时的工作,还是一个运行大约 43,000 次(每秒一次,持续 12 小时)的工作更好?

Ton*_*kle 5

每次作业启动都会产生一定的开销——读取和写入 msdb 以跟踪状态和调度计算、创建会话等。因此,从效率的角度来看,最好在循环中运行它。这也将使其运行得更接近每一秒,因为当作业开始时,作业需要一些时间才能真正到达执行代码的点。因此,如果有任何事情导致作业实际到达执行代码点的随机 0.25 秒延迟,那么您可能在代码执行之间存在显着差距。我认为(如果我错了,请有人纠正我)它必须经过整个登录过程,因此由于网络问题,可能会导致身份验证过程出现延迟。

在循环中运行它的缺点是您必须处理代码中的任何错误。如果作业每秒运行一次,您可以在作业上配置失败通知,如果出现问题,您将收到一封电子邮件。如果它在循环中运行,您将需要处理代码中的错误和通知,并监视作业以确保它正在运行。

  • 我会选择带有循环选项的一份工作,然后有条件地在循环中执行 BREAK。但是,如果出现问题,那么您需要确定在不运行此工作的情况下您可以爱多久。我想,最简单的方法是让作业每分钟执行一次。如果作业已在运行,则代理将不会启动第二个实例。 (2认同)