SQL 服务器 2012 - 挂起
SQL Server 2012 - Hanging
我有一份 运行 几个月都没有问题的工作。它 运行 在我们的 test/dev 服务器和我们的生产服务器上。两种环境中的数据库和作业是相同的。
几天前,该作业在生产环境中停止运行。它在 test/dev 环境中仍然可以正常工作。
存储过程的作业 运行s。当有人通知我他们的查询不起作用时,我第一次被提醒这个问题。我找到了这份通常需要大约 12 分钟的工作 运行ning 了 3.5 小时。它挂在第三个 SP 上。它每 3 小时 运行s 并且 运行 比之前的预定时间还好。
我杀了这份工作,因为,连第一个 SP 都做不了。第一个 SP 有四个步骤:
1. 将链接服务器中的数据检索到临时 table(工作正常)。
2. 从常规 table 中删除数据,其中日期范围与从链接服务器检索到的数据相匹配。
3.将检索到的数据插入正则table。
4.重建索引。
从链接服务器检索数据有效,我可以在临时 table 中看到数据,查询它等。但是,当它进入删除步骤时,似乎什么也没有发生。它使用 CPU,但通常需要 3-5 秒(根据历史记录)的过程似乎将永远持续下去。在取消该过程之前,我已经让它走了长达 45 分钟。
dbcc checkdb 显示没有错误。我重启了SQL服务器,然后重启物理服务器,检查硬盘space,重建所有索引,检查内存等等。我不知道下一步该去哪里。
重启物理服务器后,我立即在任何人或任何其他进程可能导致争用问题之前重试第一个 SP,但结果仍然相同。
有什么建议吗?
谢谢。
看看我的博客postUnexplained SQL Server Timeouts and Intermittent Blocking
以下部分可能会为您提供所需的线索。
If the stored proc getUserPrivileges didn’t have enough problems for
you, then let me add: it probably gets recompiled on each call. So
SQL Server acquires a COMPILE lock on each call. The reason it gets
recompiled is because the temp table gets created and then a lot of
rows are deleted from it.... This will cause the stored proc to be recompiled on
the SELECT that follows (yes, in the middle of running the stored
proc.) In other procs I’ve noticed a DECLARE CURSOR statement
whose SELECT statement references a temporary table – this will force
a recompile too.
For more info on recompilation see:
http://support.microsoft.com/kb/243586/en-us
所以对我来说,它可能在某些环境下工作而不在其他环境下工作是有意义的,这取决于正在进行的删除操作,即使它是永久性的 table。
你能把你的存储过程分成 2 个吗?第一个会得到删除日期范围并进行删除。第二个将处理新的插入。我认为这会成功,所以它不会在 运行.
中间开始重新编译
我有一份 运行 几个月都没有问题的工作。它 运行 在我们的 test/dev 服务器和我们的生产服务器上。两种环境中的数据库和作业是相同的。
几天前,该作业在生产环境中停止运行。它在 test/dev 环境中仍然可以正常工作。
存储过程的作业 运行s。当有人通知我他们的查询不起作用时,我第一次被提醒这个问题。我找到了这份通常需要大约 12 分钟的工作 运行ning 了 3.5 小时。它挂在第三个 SP 上。它每 3 小时 运行s 并且 运行 比之前的预定时间还好。
我杀了这份工作,因为,连第一个 SP 都做不了。第一个 SP 有四个步骤: 1. 将链接服务器中的数据检索到临时 table(工作正常)。 2. 从常规 table 中删除数据,其中日期范围与从链接服务器检索到的数据相匹配。 3.将检索到的数据插入正则table。 4.重建索引。
从链接服务器检索数据有效,我可以在临时 table 中看到数据,查询它等。但是,当它进入删除步骤时,似乎什么也没有发生。它使用 CPU,但通常需要 3-5 秒(根据历史记录)的过程似乎将永远持续下去。在取消该过程之前,我已经让它走了长达 45 分钟。
dbcc checkdb 显示没有错误。我重启了SQL服务器,然后重启物理服务器,检查硬盘space,重建所有索引,检查内存等等。我不知道下一步该去哪里。
重启物理服务器后,我立即在任何人或任何其他进程可能导致争用问题之前重试第一个 SP,但结果仍然相同。
有什么建议吗?
谢谢。
看看我的博客postUnexplained SQL Server Timeouts and Intermittent Blocking
以下部分可能会为您提供所需的线索。
If the stored proc getUserPrivileges didn’t have enough problems for you, then let me add: it probably gets recompiled on each call. So SQL Server acquires a COMPILE lock on each call. The reason it gets recompiled is because the temp table gets created and then a lot of rows are deleted from it.... This will cause the stored proc to be recompiled on the SELECT that follows (yes, in the middle of running the stored proc.) In other procs I’ve noticed a DECLARE CURSOR statement whose SELECT statement references a temporary table – this will force a recompile too.
For more info on recompilation see: http://support.microsoft.com/kb/243586/en-us
所以对我来说,它可能在某些环境下工作而不在其他环境下工作是有意义的,这取决于正在进行的删除操作,即使它是永久性的 table。
你能把你的存储过程分成 2 个吗?第一个会得到删除日期范围并进行删除。第二个将处理新的插入。我认为这会成功,所以它不会在 运行.
中间开始重新编译