SQL 服务器作为实时系统
SQL Server 不是实时系统,即它不能保证特定操作将在一定时间内或特定时间完成。它必须强制操作不会运行超过指定时间的唯一工具是通过超时设置,该超时将在指定时间段后强制中止(和回滚)执行。在战略位置上使用
BEGIN TRAN / END TRAN
你应该能够实现硬性17:00的切断。这将需要使用循环。
关于递归的思考
与所有语言/系统递归一样,还会产生上下文切换/上下文创建开销,SQL Server 中的 SP 也是如此。它的相对影响将取决于 SP 所做的"useful"工作的成本。你正在做的事情可以很容易地在一个WHILE循环中完成,我建议你在一个WHILE循环中做。
对绩效的思考
Update是 SQL Server 中最昂贵的操作类型,紧随其后的是SELECT 。在您的代码中,我可以计算mytable上的2次updates和1次select
让一个SP多次以“小块”的方式敲击同一个表总是比多次以大块的方式敲击慢
从不同的会话同时运行这些 SP 将需要仔细的索引和事务设置,否则它们会相互阻塞,或者值得您将以竞态条件结束。
我的建议
create my_procedure
, @object_variable int = 0
as
if (outside the allowed time) begin
return
end
if (coalesce(@object_variable,0) = 0) begin
set @object_variable to xmlhttp
end
declare @table_variable (keyfield, data, processed)
while (inside the allowed time)
begin
BEGIN TRAN
-- Combine select and update
update a
set a.unique_value = newid()
from
( select top 20-30max keyfield, data, unique_value, 0 as processed from myTable WITH( ROWLOCK ) -- rowlock to avoid blocking; MUST HAVE covering index where processed = 0
and unique_value = ''
order by id ) AS a
OUTPUT keyfield, data, unique_value, processed INTO @table_variable
@object_variable 'send' the data
COMMIT TRAN TRUNCATE
TABLE @table_variable
end -- end while
return;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。