在SQL Azure中删除没有事务日志的大数据

时间:2019-04-03 13:58:42

标签: c# sql azure azure-sql-database

我想使用以下代码频繁地从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);
                        }
                    }
                });

2 个答案:

答案 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>

删除任何外键,删除行,然后重新创建外键也可以加快速度。