Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 放弃从另一个会话/连接执行存储的过程_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server 放弃从另一个会话/连接执行存储的过程

Sql server 放弃从另一个会话/连接执行存储的过程,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有一个昂贵的存储过程,它在表中的数据更改后运行,以便预先计算这些数据的某些聚合。(如果相关的话,SP由应用程序调用,而不是由表上的触发器调用,尽管这不是一个硬性要求)。存储过程几乎完全是插入到。。。选择语句 数据通常很少更改(即SP调用很少),但原则上它们可以重叠。为了确保这种情况下的一致性,我使用了sp_getapplock,以便第二次调用将等待第一次调用完成后再继续 这是可行的,但等待是低效和不必要的——我的存储过程所做的第一件事就是删除所有现有(现已过时)数据。我真正想要的是第二次调用告

我有一个昂贵的存储过程,它在表中的数据更改后运行,以便预先计算这些数据的某些聚合。(如果相关的话,SP由应用程序调用,而不是由表上的触发器调用,尽管这不是一个硬性要求)。存储过程几乎完全是插入到。。。选择语句

数据通常很少更改(即SP调用很少),但原则上它们可以重叠。为了确保这种情况下的一致性,我使用了
sp_getapplock
,以便第二次调用将等待第一次调用完成后再继续

这是可行的,但等待是低效和不必要的——我的存储过程所做的第一件事就是删除所有现有(现已过时)数据。我真正想要的是第二次调用告诉第一次调用“不要费心继续做你正在做的事情,事情现在已经改变了——停止运行,我会让事情保持正确的状态”


在这种情况下,第二次调用是否有可靠的方法可靠地中止第一次SP调用?

每次更改后是否确实需要重新聚合

将后续更新推迟到正在进行的更新是否足够好


即使您可以中断它,您也必须等待它回滚事务,这可能需要比等待它完成更长的时间。

没有一种方法可以优雅地完成这项工作。如果对一条语句发出“kill”,则可以使该语句的连接处于未知状态。此外,正如@GilM正确指出的(+1)-回滚可能需要比完成更长的时间,这取决于执行的阶段

所以这里有一个你可能没有想到的建议。您是否考虑过使用索引视图?您可以在标准版中使用它们,但需要使用
WITH(NOEXPAND)
提示来查询它们,以获得好处。但是,您可以简单地将该视图包装到另一个包含提示的视图中

这样,您就可以用一些真正有好处的东西来代替整个过程:

  • 它完全透明地为您更新
  • 这将比“重新聚合整个集合”更有效率

您可以尝试使用sp_who获取第一个进程的processID,然后将其杀死?索引视图可以做到这一点,因为从概念上讲,这正是我手动完成的。谢谢你的指点!每次更改后都需要重新聚合(因为,如上所述,输出表实际上是输入的视图)。这通常一天只发生一次,所以不太繁重;我想优化我们手动重新计算/重新插入数据的情况。感谢您指出回滚成本,因为它似乎为通过显式同步实现这一点敲响了警钟。