Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 批量删除-自动提交与开始/提交事务_Sql Server_Autocommit - Fatal编程技术网

Sql server 批量删除-自动提交与开始/提交事务

Sql server 批量删除-自动提交与开始/提交事务,sql-server,autocommit,Sql Server,Autocommit,我在解决数据库中的问题时遇到问题。我试图寻找答案,但我发现有两个模棱两可的答案 问题: 在删除大量数据的过程中,我收到一个错误:“数据库“[TableName]”的事务日志已满。建议我删除部分数据 我找到了两种处理该问题的不同方法: (一) 我的问题是,为什么在第一个示例中,有一个用于单个操作的Begin/Commit传输(Delete Top(x)…)?我认为单个操作是自动提交的-因此不需要开始/提交? 您能告诉我哪一个选项最适合避免关于完整事务日志的错误吗?单次操作是否需要Begin/Com

我在解决数据库中的问题时遇到问题。我试图寻找答案,但我发现有两个模棱两可的答案

问题: 在删除大量数据的过程中,我收到一个错误:“数据库“[TableName]”的事务日志已满。建议我删除部分数据

我找到了两种处理该问题的不同方法:

(一)

我的问题是,为什么在第一个示例中,有一个用于单个操作的Begin/Commit传输(Delete Top(x)…)?我认为单个操作是自动提交的-因此不需要开始/提交? 您能告诉我哪一个选项最适合避免关于完整事务日志的错误吗?单次操作是否需要Begin/Commit tran?
非常感谢您的帮助。

可能不需要打开和关闭交易,但这是一种很好的做法

由于这两种方法都在一个大作业中运行,因此在作业结束之前不会关闭隐式事务

您可以尝试在各自的作业中运行每个删除部分。在SQL Server Management Studio中,有机会将“GO”与INT参数一起使用:请阅读此处:


使用这一非常有用的技巧,您可以删除块并在每次运行时运行
DBCC收缩文件(N'YourLogFile',0,TRUNCATEONLY)

这是您只需要一次还是更经常需要,还是作为某个业务流程的一部分?这是业务流程的一部分。我需要调整所有程序(负责删除数据)以部分删除数据。这些删除是在用户在表中工作时运行,还是在“夜间清理”时运行?删除会不时执行(每周一次,但在正常工作时间)。用户只使用选择类型的查询。您选择了哪种恢复配置文件,您是否定期备份数据库,包括事务日志?非常感谢Shnugo!
DECLARE @Count INT
Declare @for_delete INT
Declare @chunk_size INT
SELECT @chunk_size=100000
SELECT @Count = 0
select @for_delete=count(*) from [Your big table] where  [Your Where Clause]
While (@Count < @for_delete)
BEGIN
SELECT @Count = @Count + @chunk_size
BEGIN TRAN
DELETE top(@chunk_size) FROM  [Your big table] where  [Your Where Clause]
COMMIT TRAN
END
WHILE EXISTS(SELECT TOP 1 1 FROM Table)
BEGIN
DELETE TOP (10000) FROM Table
END