我正在使用 SQL Server 2005 中的 SQL Server 代理作业执行存储过程。
直到昨天,这项工作一直在快速进行。从昨天开始,这项工作需要超过 1 小时而不是 2 分钟。
我在 SSMS 中执行了存储过程,执行时间不到 1 分钟。
我无法弄清楚为什么作为 SQL Server 代理作业执行时需要超过 1 小时?
我正在使用 SQL Server 2005 中的 SQL Server 代理作业执行存储过程。
直到昨天,这项工作一直在快速进行。从昨天开始,这项工作需要超过 1 小时而不是 2 分钟。
我在 SSMS 中执行了存储过程,执行时间不到 1 分钟。
我无法弄清楚为什么作为 SQL Server 代理作业执行时需要超过 1 小时?
经过一段时间的评论并假设 SP 在 SSMS 中执行时使用相同的输入参数和数据表现良好,我最终认为我可以给出最后一个提示:
根据在 SP 中执行的操作(例如在循环或游标中插入/更新/删除大量数据),您应该在代码的开头设置 nocount。
set nocount on
如果不是这种情况或没有帮助,请添加更多信息,已在评论中提到(例如,作业和每个作业步骤的所有设置、已记录的内容、作业历史记录中的内容、检查 SQLerrorlogs、事件日志、.. ..)。还可以看看“SQL Server Logs”也许你可以在这里收集一些信息。此外,查看数据库服务器的应用程序/系统事件总是一个好主意。要获得基本概述,您可以使用 SSMS 中的 Activitymonitor,方法是选择 Databaseserver 并从 contextmenu 中选择“Activity monitor”并搜索 sql agent。
我最后一次尝试是尝试为代理运行 sql 跟踪。在这种情况下,您将启动跟踪和过滤,例如按 SQLAgent 服务运行的用户。您可以为跟踪设置很多选项,因此我建议您在 Google 上搜索,在 MSDN 上搜索或在 stackoverflow 上提出另一个问题。
我对调用我创建的许多 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 分几秒内完成。
我希望这有帮助...
我注意到 SQL 代理作业忽略服务器的 MAXDOP 设置并运行 MAXDOP 为 1 的所有内容。如果我在查询窗口中运行存储过程,它会遵循服务器设置并使用 4 个进程。如果我使用 SQL 代理,我运行的任何存储过程都只使用一个进程。
我们有一个大型进程,在 SSMS 中运行 88 秒,在 SQL Server 代理中运行 30-45 分钟。我添加了dbo。所有表名的前缀,现在它的运行速度与 SSMS 一样快。