我们在 SQL Server 2008 中有一个数据库,其Recovery model
设置为Simple
.
定期,我们在一张大表上运行一次大更新(要更新 1500 万行)。为此,我们运行了一个需要 2 小时以上运行的存储过程。当存储过程完成运行时,日志文件增长到 37GB,这有点奇怪,因为恢复模型很简单,而且我们甚至没有在存储过程中明确开始事务(我们对数据库进行了完整备份在更新之前为安全起见)
此外,当我们缩小日志文件时,它会回到 1MB
是否可以阻止日志文件增长到 37GB?
谢谢
我有一个类似的问题。我需要删除几百万条旧记录。大约 30 分钟后删除失败,因为日志文件的可用空间太小。我们通过修改删除语句来解决它,一次只删除 500,000 条记录。这解决了问题。
将这些知识应用到您的案例中。你能运行几个较小的更新而不是一个大的更新吗?这可以通过在存储过程中显式添加“开始事务”和“提交”语句来完成。除了在存储过程的开头和结尾处声明之外,您还可以在一百万行之后发出提交并开始一个新事务。我不会在每次更新后进行提交,因为这会大大降低性能。另一种选择是将存储过程限制在一定数量并多次调用它或创建类似的存储过程来处理数据的不同部分。
由于您没有明确使用事务边界,因此您可能会幸运地将事务隔离级别设置为未提交的读取。见这里。我认为它可能会加快处理速度,但我不认为它会对事务日志产生重大影响。请注意,您可以通过将隔离级别设置为未提交的读取来启用脏读。
我还建议尝试分解操作以最大程度地减少日志增长。除非您启用了 auto_shrink,否则 SQL Server 不会自动收缩日志,这可能会导致严重的性能问题。
AFAIK,自动收缩仅每 30 分钟运行一次。您在存储过程完成后多长时间查看日志文件?另外,这台服务器上有多少个数据库?Autoshrink 在循环的基础上工作,可能需要一段时间才能访问这个特定的数据库。