我想使用以下代码频繁地从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);
}
}
});
答案 0 :(得分:1)
不能。数据库使用事务日志进行更改,以便它可以处理事务中间的故障。因此,即使删除操作也会使用事务日志中的空间。现在,事务日志仅占用空间(当像SQL Azure那样对用户数据库使用完全恢复时)直到下一次备份操作为止。今天,这种情况每隔几分钟发生一次,因此磁盘上用于日志的空间所需的时间非常短。
有些操作的日志记录最少,并且比逐行删除使用的空间更少。例如,如果您执行截断表或从分区表换出一个分区(然后将其删除),则生成的日志要比逐行少得多。您需要考虑对架构进行一些设计更改才能启用此模式,因为您现在不只是删除所有行。
最终,您应该只专注于确保在SQL Azure中执行的操作高效。如果循环遍历堆并一遍又一遍删除K行,则可以在算法上对表执行多次扫描,而不是范围扫描。如果即使没有任何花哨的截断/分区方法也可以做到这一点,那么您可能可以在现在的系统基础上提高系统性能。
希望有助于解释SQL的工作原理。
答案 1 :(得分:0)
尝试使用batching技术来最大程度地减少日志使用量。
<input id="txtbox1" />
<select onchange="DependentControlByDropDown(this,'Yes','txtbox1')">
<option value=""></option>
<option value="Yes">Yes</option>
<option value="No">No</option>
</select>
删除任何外键,删除行,然后重新创建外键也可以加快速度。