【问题标题】:What's the advantage of using chunking without transaction block in tsql?在sql中使用没有事务块的分块有什么好处?
【发布时间】:2015-07-15 19:27:57
【问题描述】:

我在我们的代码库中的一个 sql 存储过程中遇到了一段代码,它在没有事务块的情况下使用分块。我看不出没有 tran 块的分块有什么好处?当我没有深入挖掘就得出结论时,我已经谦卑了几次,那么没有 tran 块的分块有什么优势呢?有吗?

伪代码类似于:

  • 填充主临时表(ID、名称、UpdatedFlag)。这个标志栏 指示记录是否已更新。

  • 开始 while 循环(只要 MainTable 中有一条记录 更新标志 = 0)

  • 只选择给定的 chunkSize 到 ChunkSizeMain tempTable (ID, 名称)来自尚未标记为已更新的记录
  • 开始 TRY 块
  • 通过加入 ID 开始更新其他表 块大小主表。
  • 在 MainTable 中更新 UpdatedFlag = 1。
  • 结束尝试
  • 开始捕捉 //一些动作结束捕捉

【问题讨论】:

    标签: sql-server sql-server-2008 tsql transactions chunking


    【解决方案1】:

    SQL Server 中的每个更新查询都在事务中运行,无论它旁边是否有 BEGIN TRAN。 (autocommit transaction 如果implicit_transaction 未开启)

    “分块”通常用于在数据库处于简单恢复模式时停止需要增加大小的事务日志。影响 100 万行的单个 UPDATE 语句需要将所有这些记录到活动日志中。分批可以让较早提交的批中的日志被截断并被以后的批重用。

    还可以通过减少每个操作的时间长度和/或通过一次仅更新几千行来潜在地降低锁升级的风险来减少对并发查询的影响。

    【讨论】:

    • 是否意味着 Begin Tran on Update 语句是多余的?我刚刚运行了一个测试,如果更新失败,sql 不会更新任何行(我从未注意到,smh)。现在,我正在查看的代码完全有意义。插入和删除也不一样,必须指定Begin Tran吧?
    • @NoSaidTheCompiler - 所有语句都在事务中运行,而不仅仅是更新。对于单个语句,使用显式事务没有任何好处。
    • 根据您想要获得的效果,以原子方式(即在一个事务中)更新临时表和“实时”表可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 2012-07-11
    • 1970-01-01
    • 2015-12-19
    • 2023-01-04
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多