gpt4 book ai didi

c# - 在SQL azure中删除没有事务日志的大数据

转载 作者:行者123 更新时间:2023-12-02 08:01:23 25 4
gpt4 key购买 nike

我想经常使用下面的代码从azure SQL表中删除大量数据,但是当删除记录时,将创建事务日志,这将消耗数据库数据存储,我们如何在没有事务日志和消耗数据库的情况下执行删除数据存储?

                  Task.Run(async () =>
{
long maxId = crumbManager.GetMaxId(fromDate,tenantId);
var startingTime = DateTime.UtcNow;
while (!cancellationToken.IsCancellationRequested && maxId > 0 && startingTime.AddHours(2) > DateTime.UtcNow)
{
try
{
var query = $@"delete top(10000) from Crumbs where CrumbId <= @maxId and TenantId =@tenantId ";
using (var con = new SqlConnection(connection))
{
con.Open();
using (var cmd = new SqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@maxId", maxId);
cmd.Parameters.AddWithValue("@tenantId", tenantId);
cmd.CommandTimeout = 200;
var affected = cmd.ExecuteNonQuery();
if (affected == 0)
{
break;
}
}
}
}
catch (Exception ex)
{

}
finally
{
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken.Token);
}
}
});

最佳答案

你不能。数据库使用事务日志进行更改,以便它可以处理事务中间的故障。因此,即使删除操作也会占用事务日志中的空间。现在,事务日志仅在下一次备份操作之前占用空间(当像 SQL Azure 对用户数据库那样使用完全恢复时)。今天这些事件每隔几分钟就会发生一次,因此日志所需的磁盘空间时间非常短。

有些操作的日志记录最少,并且比逐行删除使用的空间更少。例如,如果您执行截断表或从分区表中换出分区(然后删除它),那么您生成的日志比逐行执行的日志要少得多。您需要考虑对架构进行一些设计更改才能启用此模式,因为您现在不只是删除所有行。

最终,您应该只关注确保在 SQL Azure 中执行的操作高效。如果您在堆上循环并一遍又一遍地删除 K 行,则可以通过算法对表执行多次扫描,而不是范围扫描。如果您这样做,即使没有任何花哨的截断/分区方法,您也可能能够比现在拥有的系统提高性能。

希望这有助于解释 SQL 的工作原理。

关于c# - 在SQL azure中删除没有事务日志的大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com