【问题标题】:SQL Server Agent Job Running SlowSQL Server 代理作业运行缓慢
【发布时间】:2011-08-16 20:07:40
【问题描述】:

我正在使用 SQL Server 2005 中的 SQL Server 代理作业执行存储过程。

直到昨天,这项工作一直在快速运行。从昨天开始,这项工作需要超过 1 小时而不是 2 分钟。

我在 SSMS 中执行了存储过程,执行时间不到 1 分钟。

我不明白为什么在作为 SQL Server 代理作业执行时需要超过 1 小时?

【问题讨论】:

  • 如果您在 SSMS 中执行相同的 SP 并且它有效,则可能是 Job 的设置已更改,例如它在错误的数据库上执行。如果没有,请检查 Activity Monitor 代理正在做什么或启动跟踪以获取已执行的命令。也许有锁定问题。如果手动执行作业,是否还会出现问题?
  • @Bernhard,感谢您的回复。我检查了作业并重新创建了它。还是同样的问题。是的,如果我手动执行这项工作,它仍然需要很多时间
  • @Preteek 你能发布工作的设置吗?我能想到的这种行为的唯一原因是 SP 的不同执行。由于参数等与手动执行时相同,因此 SQLServer 应该使用相同的执行计划等。也许你可以看看 SQL Log - 也许这会给我们一个提示。
  • @Bernhard- 在工作属性中,Owner=sa;在步骤中,类型=t-SQL;命令 = Exec dbo.StoredProcedureName
  • @Bernard - 没有理由假设他们将使用相同的计划。可能是参数嗅探问题见Slow in the Application, Fast in SSMS? Understanding Performance Mysteries

标签: sql-server sql-server-2005 sql-agent-job sql-agent


【解决方案1】:

经过一段时间的评论并假设 SP 在 SSMS 中执行时使用相同的输入参数和数据表现良好,我最终认为我可以给出最后一个提示:

根据在 SP 中执行的操作(例如,在循环或游标中插入/更新/删除大量数据),您应该在代码的开头设置 nocount。

set nocount on

如果不是这种情况或没有帮助,请添加更多信息,在 cmets 中已经提到(例如,作业和每个 Jobstep 的所有设置,已记录的内容,Jobhistory 中的内容,检查 SQLerrorlogs,eventlogs ,....)。 还可以看看“SQL Server Logs”也许你可以在这里收集一些信息。此外,查看数据库服务器的应用程序/系统事件总是一个好主意。 要获得基本概述,您可以使用 SSMS 中的 Activitymonitor,方法是选择 Databaseserver 并从 contextmenu 中选择“Activity monitor”并搜索 sql agent。

我最后一次尝试是尝试为代理运行 sql 跟踪。在这种情况下,您将开始跟踪并过滤,例如由运行 SQLAgent 服务的用户。您可以为跟踪设置很多选项,因此我建议您在 Google 上搜索,在 MSDN 上搜索或在 stackoverflow 上问另一个问题。

【讨论】:

    【解决方案2】:

    我注意到 SQL 代理作业会忽略服务器的 MAXDOP 设置并运行 MAXDOP 为 1 的所有内容。如果我在查询窗口中运行存储过程,它会遵循服务器设置并使用 4 个进程。如果我使用 SQL 代理,我运行的任何存储过程都只使用一个进程。

    【讨论】:

      【解决方案3】:

      我在调用我创建的多个 UDF 的脚本时遇到了类似的问题。 UDF 本身通常在 SSMS 下运行亚秒级。同样,在 SSMS 下运行我用它们生成的报告是可以忍受的(8s 中的 30d 数据,22s 中的 365d 数据)。我一直对我的 SQL 代理作业进行 NOCOUNT ON,因为它们通常会生成文本文件以供其他进程或 Excel 提取,并且我不希望最后有额外的数据,所以这不是我的解决方案。

      在这种情况下,当我们在 SQL 代理下运行完全相同的脚本作为作业时,我的时间呈指数增长。我的 8 秒脚本需要 2 分 30 秒,我的 22 秒脚本需要 2 小时 20 分。无论我在中午运行其他用户活动和作业,还是在没有用户活动、作业或备份运行的下班后运行它,这都是一样的。我们的服务器处于空闲状态,充其量我得到运行时使用的 8 个内核之一。 DB 在带有缓存 RAID 卡的 SSD 上仅运行大约 10GB,并且 16 个 32GB RAM 是免费的。由于我的 SQL 在 SSMS 中高效运行,我非常相信我正在达到某种线程限制。我已经研究并尝试在 SQL 代理中的脚本之前调整 MAXDOP,但没有运气。

      由于这是我要安排的活动,因此需要以某种方式自动化。我可以让这些脚本在 SQL 代理作业中作为 SQL 步骤运行所需的时间,但我决定改为从命令行运行,并获得与在 SSMS 中看到的相同的性能。

          sqlcmd -S SQLSRVRHost -i "C:\My Script Loc With Spaces.sql" -v MyVar="VarValue" >"C:\MyOutputFile.txt"
      

      所以我创建了一个批处理脚本,其中包含从 sqlcmd 运行的 SQL 作业。然后我从 SQL 代理作业运行批处理脚本,所以我仍然有相同的管理和控制。从 SQL 代理执行的单个批处理脚本中,我的 4 个 SQL 作业总共需要 3 多个小时才能在 1 分几秒内完成。

      我希望这会有所帮助...

      【讨论】:

        【解决方案4】:

        我们有一个大型进程,在 SSMS 中运行 88 秒,在 SQL Server 代理中运行 30-45 分钟。我添加了dbo。所有表名的前缀,现在它的运行速度与 SSMS 一样快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-24
          相关资源
          最近更新 更多