在sql中使用没有事务块的分块有什么好处?
What's the advantage of using chunking without transaction block in tsql?
我在我们代码库的 sql 存储过程中发现了一段代码,它使用没有事务块的分块。如果没有 tran 块,我看不出分块会有什么好处?当我在没有深入挖掘的情况下就得出结论时,我已经谦卑了几次,那么没有 tran 块的分块有什么优势呢?有吗?
伪代码是这样的:
填充主温度table(ID、名称、更新标志)。这个标志柱
表示记录是否更新。
开始while循环(只要MainTable中有记录就做
更新标志 = 0)
- 只有select将给定的chunkSize放入ChunkSizeMain tempTable(ID,
姓名)来自未标记为更新的记录
- 开始 TRY 区块
- 通过加入 ID 开始更新其他 table
块大小主表。
- 更新 MainTable 中的 UpdatedFlag = 1。
- 结束尝试
- 开始捕捉//一些动作结束捕捉
SQL 服务器中的每个更新查询都在事务中运行,无论它旁边是否有 BEGIN TRAN
。 (autocommit transaction 如果 implicit_transaction
未开启)
"Chunking" 通常用于在数据库处于简单恢复模式时停止需要增加大小的事务日志。影响 100 万行的单个 UPDATE
语句将需要将所有这些记录到活动日志中。分成批次可以允许较早提交的批次中的日志被截断并由以后的批次重用。
还可以通过减少每个操作的时间长度来减少对并发查询的影响and/or通过一次只更新几千行来潜在地降低锁升级的风险。
我在我们代码库的 sql 存储过程中发现了一段代码,它使用没有事务块的分块。如果没有 tran 块,我看不出分块会有什么好处?当我在没有深入挖掘的情况下就得出结论时,我已经谦卑了几次,那么没有 tran 块的分块有什么优势呢?有吗?
伪代码是这样的:
填充主温度table(ID、名称、更新标志)。这个标志柱 表示记录是否更新。
开始while循环(只要MainTable中有记录就做 更新标志 = 0)
- 只有select将给定的chunkSize放入ChunkSizeMain tempTable(ID, 姓名)来自未标记为更新的记录
- 开始 TRY 区块
- 通过加入 ID 开始更新其他 table 块大小主表。
- 更新 MainTable 中的 UpdatedFlag = 1。
- 结束尝试
- 开始捕捉//一些动作结束捕捉
SQL 服务器中的每个更新查询都在事务中运行,无论它旁边是否有 BEGIN TRAN
。 (autocommit transaction 如果 implicit_transaction
未开启)
"Chunking" 通常用于在数据库处于简单恢复模式时停止需要增加大小的事务日志。影响 100 万行的单个 UPDATE
语句将需要将所有这些记录到活动日志中。分成批次可以允许较早提交的批次中的日志被截断并由以后的批次重用。
还可以通过减少每个操作的时间长度来减少对并发查询的影响and/or通过一次只更新几千行来潜在地降低锁升级的风险。