7

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

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

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

我无法弄清楚为什么作为 SQL Server 代理作业执行时需要超过 1 小时?

4

4 回答 4

7

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

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

set nocount on

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

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

于 2011-08-17T17:45:43.183 回答
2

我对调用我创建的许多 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 代理作业运行批处理脚本,所以我仍然有相同的管理和控制。我的 4 个 SQL 作业总共需要 3 多个小时才能从 SQL 代理执行的单个批处理脚本在 1 分几秒内完成。

我希望这有帮助...

于 2014-08-07T14:32:57.130 回答
2

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

于 2012-08-01T20:24:03.300 回答
1

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

于 2015-12-07T10:27:12.847 回答