【发布时间】:2009-06-18 21:19:55
【问题描述】:
客户端报告在执行存储过程时重复出现非常奇怪的行为。
他们的代码运行在一个易失数据集的缓存转置上。如果满足以下条件,则会编写存储过程以按需重新处理数据集:
1. 自上次重新处理后数据集发生了变化
2. 数据集5分钟没有变化
(第二个条件在变化期间停止大量重复重新计算。)
这在几周内运行良好,SP 需要 1-2 秒才能完成重新处理,而且它只在需要时才这样做。那么……
- SP 突然“停止工作”(它只是继续运行并且从未返回)
- 我们以一种微妙的方式改变了 SP,它再次起作用了
- 几天后它再次停止工作
- 然后有人说“我们以前见过,只需重新编译 SP”
- 在代码不变的情况下,我们重新编译了 SP,它工作了
- 几天后它再次停止工作
这已经重复了很多很多次了。 SP 突然“停止工作”,不再返回,客户端超时。 (我们尝试通过 management studio 运行,15 分钟后取消查询。)
然而每次我们重新编译 SP 时,它突然又可以工作了。
我还没有在适当的 EXEC 语句上尝试 WITH RECOMPILE,但我并不想以任何方式这样做。它每小时被调用数百次,通常什么都不做(它每天只重新处理数据几次)。如果可能的话,我想避免重新编译相对复杂的 SP 的开销“只是为了避免“不应该”发生的事情......
- 以前有没有人经历过这种情况?
- 有人对如何克服它有任何建议吗?
干杯,
德姆斯。
编辑:
伪代码如下:
- 从 table_x 中读取“a”
- 从 table_x 中读取“b”
- 如果 (a
- 开始交易
- 删除表_y
- INSERT INTO table_y
- 更新表_x
- 提交交易
选择“不漂亮”,但是当在线执行时,它们会立即执行。包括当 SP 拒绝完成时。探查器显示它是 SP“停止”的 INSERT
SP 没有参数,sp_lock 显示没有阻塞进程。
【问题讨论】:
-
听起来好像您有一个未提交或回滚的事务。不看代码很难说。
-
哦,下载最新的服务包和更新永远不会有什么坏处。
-
它必须是一个LOCK,或者至少表现得像这样......
-
我们的客户已将所有 IT 外包给 IBM。他们只在自己喜欢的时候修补什么。
-
“在重新运行 ALTER 语句后立即运行完美”这太巧合了,而且 sp_lock 没有显示任何相关信息。 (嗯,sp_lock3 是从某人的网站上复制的)
标签: sql sql-server sql-server-2005 tsql stored-procedures