我有一个Azure存储表,它有3k +记录。
删除表中所有行的最有效方法是什么?
对于3000条记录,最简单的方法是delete the table。但请注意,当您删除表时,它当时不会被删除,而是被放入某种队列中删除,并且实际上会在一段时间后删除。此时间取决于系统上的负载+表中实体的数量。在此期间,您将无法重新创建此表或使用此表。
如果您继续使用该表很重要,则唯一的其他选项是删除实体。为了更快删除,您可以查看使用Entity Batch Transactions
删除实体。但是要删除实体,您需要先获取实体。您可以通过仅获取实体的PartitionKey
和RowKey
属性而不是获取所有属性来加速获取过程,因为删除实体只需要这两个属性。
我用的是这样的东西。我们按日期划分密钥,您的情况可能会有所不同:
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);
}
}
这取决于数据的结构,但如果您可以为所有记录撰写查询,则可以将每个记录添加到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);