开发者社区> 问答> 正文

SQL服务器:递归和开销

SQL服务器:递归和开销

展开
收起
贺贺_ 2019-12-02 19:08:22 441 0
1 条回答
写回答
取消 提交回答
  • SQL 服务器作为实时系统

    SQL Server 不是实时系统,即它不能保证特定操作将在一定时间内或特定时间完成。它必须强制操作不会运行超过指定时间的唯一工具是通过超时设置,该超时将在指定时间段后强制中止(和回滚)执行。在战略位置上使用

    BEGIN TRAN / END TRAN
    
    

    你应该能够实现硬性17:00的切断。这将需要使用循环。

    关于递归的思考

    与所有语言/系统递归一样,还会产生上下文切换/上下文创建开销,SQL Server 中的 SP 也是如此。它的相对影响将取决于 SP 所做的"useful"工作的成本。你正在做的事情可以很容易地在一个WHILE循环中完成,我建议你在一个WHILE循环中做。

    对绩效的思考

    1. Update是 SQL Server 中最昂贵的操作类型,紧随其后的是SELECT 。在您的代码中,我可以计算mytable上的2次updates和1次select

    2. 让一个SP多次以“小块”的方式敲击同一个表总是比多次以大块的方式敲击慢

    3. 从不同的会话同时运行这些 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;
    
    
    2019-12-02 19:09:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS计算与存储分离架构实践 立即下载