我有一个 SQL Server 存储过程,它本质上将复杂的数据库“扁平化”为单独数据库中的单个简化表,以允许用户查询数据而无需了解数据库结构。SP 截断目标表,插入主键和其他字段,然后使用用户函数和各种查询来执行一系列更新以填充表中的所有其他字段以格式化数据。有大约。表中有 900 万行,SP 运行大约需要 2.5 小时,在此期间日志文件增长到超过 30GB。该数据库位于磁盘空间有限的 Azure 服务器上,最近由于日志文件空间不足,SP 崩溃了。
目标数据库处于简单恢复模式,并且 SP 运行了一个周末,因此没有其他进程或用户使用它。SP 不包含任何事务或提交,也不会对工作进行分块,它只是从开始到结束插入、更新(偶尔删除)行。如何提高效率并使用更少的日志文件空间?它应该在运行时使用事务、提交或收缩日志文件吗?或者是其他东西?
所有这些都需要在一笔巨大的交易中完成吗?如果您不告诉它不同,您的数据库将默认执行此操作。请记住,您在事务中所做的一切都必须适合可用的“日志空间”。但是,一旦您发出提交,该“日志空间”就再次可用。
根据每个“步骤”所做的工作量,您可以执行所有插入,提交这些插入,然后执行更新,可能以“块”的形式进行,在进行时提交每个插入。放入提交意味着您不应该用完事务日志空间。
如果整个过程失败,您将丢弃“其他”数据库并从头开始重建它。