Sql Server 中的大事务,有啥问题吗?

Posted

技术标签:

【中文标题】Sql Server 中的大事务,有啥问题吗?【英文标题】:Huge transaction in Sql Server, are there any problems?Sql Server 中的大事务,有什么问题吗? 【发布时间】:2011-09-10 14:55:25 【问题描述】:

我有一个程序可以在一个事务中对 SQL Server 2005 或 2008 数据库执行许多批量操作(删除和创建索引、创建列、全表更新等)。

有什么问题可以预料吗?

我知道即使在简单恢复模式下事务日志也会扩展。 该程序在系统正常运行时不会执行,因此锁定和并发不是问题。

还有其他理由将事务拆分成更小的步骤吗?

【问题讨论】:

我会提议你把这个问题抛在脑后。为什么要在一个事务中完成所有这些工作? 因为实现起来很简单。我不必关心中间状态。整个事情要么完成,要么没有。它不仅仅是一个 SQL 脚本,它由一堆动态加载和执行的独立类组成。 【参考方案1】:

总之,

使用较小的事务可以提供更可靠的故障恢复。 长事务还可能不必要地长时间锁定对象,而其他进程可能需要访问,即阻塞。

请考虑,如果在事务开始和结束之间的任何时间点,您的服务器出现故障,为了使数据库联机,SQL Server 必须执行崩溃恢复过程,这将涉及回滚所有未提交的事务来自日志。

假设您开发了一个足够智能的数据处理解决方案,可以从中断的地方继续工作。通过使用单个事务,这对您来说不是一个可用的选项,因为您需要再次从乞讨开始该过程。

【讨论】:

【参考方案2】:

如果事务导致过多的数据库日志条目(更新),则日志可能会达到所谓的“高水位线”。这是日志达到(大约)其绝对最大大小的一半的点,此时它必须开始回滚所有更新(这将消耗大约与执行更新相同数量的磁盘。

此时不回滚将意味着有可能最终达到最大日志大小并且仍然没有完成事务或执行回滚命令,此时数据库会因为没有足够的日志空间进行回滚而搞砸了。

【讨论】:

请问你的“高水位”有参考吗? 有趣。我猜默认情况下日志空间不受限制。它会受到客户站点的某些 DBA 的限制吗?【参考方案3】:

在您用完磁盘空间之前,这并不是真正的问题,但您会发现回滚需要很长时间。我当然不是说要为失败做准备。

但是,请考虑进程而不是事务日志。我会考虑分开:

DDL 到单独的事务中 使用事务批量加载暂存表 在另一个事务中将数据从暂存表刷新到最终表

如果出现问题,我希望您有回滚脚本和/或备份。

真的需要原子地做所有事情吗?

【讨论】:

不,不需要以原子方式进行,但到目前为止它一直是最简单的。我不需要关心回滚和重新启动整个事情。我不能那么容易地分离 DDL,因为我在很多地方添加新列或表并从现有表中迁移数据,然后删除旧列或表。【参考方案4】:

根据您的更新语句的复杂性,我建议仅在有 100 行的小表上执行此操作。特别是如果您只有少量可用的主内存。否则,例如,大表上的更新可能需要很长时间,甚至看起来会挂起。然后很难弄清楚进程 (spid) 正在做什么以及可能需要多长时间。

我不确定“删除索引”是否是事务记录操作。请参阅 ***.com 上的 this question。

【讨论】:

以上是关于Sql Server 中的大事务,有啥问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

c# 中的 DateTime 和 SQL server 中的 DateTime 有啥区别吗?

从 SQL Server 中的大表中删除大部分数据的策略

将现有 SQL Server 2005 数据库中的数据类型 varchar 更改为 nvarchar。有啥问题吗?

SQL Server 中的事务和@@Error 函数

sql server 2000日志有啥用处

sql server 2000中,如何查询事务日志?事务日志有啥作用?