删除所有Azure表记录

问题描述 投票:13回答:3

我有一个Azure存储表,它有3k +记录。

删除表中所有行的最有效方法是什么?

c# azure azure-storage azure-table-storage
3个回答
19
投票

对于3000条记录,最简单的方法是delete the table。但请注意,当您删除表时,它当时不会被删除,而是被放入某种队列中删除,并且实际上会在一段时间后删除。此时间取决于系统上的负载+表中实体的数量。在此期间,您将无法重新创建此表或使用此表。

如果您继续使用该表很重要,则唯一的其他选项是删除实体。为了更快删除,您可以查看使用Entity Batch Transactions删除实体。但是要删除实体,您需要先获取实体。您可以通过仅获取实体的PartitionKeyRowKey属性而不是获取所有属性来加速获取过程,因为删除实体只需要这两个属性。


1
投票

我用的是这样的东西。我们按日期划分密钥,您的情况可能会有所不同:

async Task Main()
{
    var startDate = new DateTime(2011, 1, 1);
    var endDate = new DateTime(2012, 1, 1);

    var account = CloudStorageAccount.Parse("connString");
    var client = account.CreateCloudTableClient();
    var table = client.GetTableReference("TableName");

    var dates = Enumerable.Range(0, Math.Abs((startDate.Month - endDate.Month) + 12 * (startDate.Year - endDate.Year)))
        .Select(offset => startDate.AddMonths(offset))
        .ToList();

    foreach (var date in dates)
    {
        var key = $"{date.ToShortDateString()}";

        var query = $"(PartitionKey eq '{key}')";
        var rangeQuery = new TableQuery<TableEntity>().Where(query);

        var result = table.ExecuteQuery<TableEntity>(rangeQuery);
        $"Deleting data from {date.ToShortDateString()}, key {key}, has {result.Count()} records.".Dump();

        var allTasks = result.Select(async r =>
        {
            try
            {
                await table.ExecuteAsync(TableOperation.Delete(r));
            }
            catch (Exception e) { $"{r.RowKey} - {e.ToString()}".Dump(); }
        });
        await Task.WhenAll(allTasks);
    }
}

0
投票

这取决于数据的结构,但如果您可以为所有记录撰写查询,则可以将每个记录添加到TableBatchOperation并一次性执行。

这是一个示例,它只是从How to get started with Azure Table storage and Visual Studio connected services改编的相同分区键中获取所有结果。

// query all rows
CloudTable peopleTable = tableClient.GetTableReference("myTableName");
var query = new TableQuery<MyTableEntity>();
var result = await remindersTable.ExecuteQuerySegmentedAsync(query, null);

// Create the batch operation.
TableBatchOperation batchDeleteOperation = new TableBatchOperation();

foreach (var row in result)
{
    batchDeleteOperation.Delete(row);
}

// Execute the batch operation.
await remindersTable.ExecuteBatchAsync(batchDeleteOperation);
© www.soinside.com 2019 - 2024. All rights reserved.