.net - 删除 Azure 表行
问题描述
我正在尝试删除旧的天蓝色日志,这是我的代码;
TableOperation tableOperation;
CloudTableClient cloudTableClient = CosmosStorageAccount.CreateCloudTableClient();
foreach (var tableName in tableNames)
{
var table = cloudTableClient.GetTableReference(tableName);
TableQuery query = new TableQuery().Where(TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.LessThan, DateTimeOffset.Now.AddDays(-15).Date));
try
{
var missing = 0;
var oldRows = table.ExecuteQuery(query).ToList();
var index = 0;
while (index < oldRows.Count())
{
if (oldRows[index] != null)
{
tableOperation = TableOperation.Delete(oldRows[index]);
await table.ExecuteAsync(tableOperation);
Debug.WriteLine(index);
index++;
}
else
{
missing++;
index++;
}
}
Debug.WriteLine($"{tableName} => Deleted : {index} , Missing : {missing}");
}
catch (Exception e)
{
var exception = e.Message;
}
}
}
问题是我逐行删除日志,这需要很多时间。我可以应用批处理操作逐组删除,但在我的日志表中,所有行都有不同的分区键(我认为这是一个设计错误)。有没有其他方法可以删除多行而不是一一删除,即使所有日志都有不同的分区键?
解决方案
这些ExecuteBatch()
方法允许多个删除操作,但有一些注意事项需要您在执行作业之前将作业拆分为批次,包括在分区键上拆分:
- 每个请求最多 100 个实体
- 每个实体只能出现一次
- 所有实体必须具有相同的分区键
- 总有效载荷不能超过 4 MiB
- 项目清单
在这些限制内,您可以混合和匹配事务类型,以便(如果需要)在同一批次中删除、更新或插入。
var oldRows = table.ExecuteQuery(query).ToList();
//Divide rows into batches by partition key and max size
foreach(var batch in batches) {
// Create the batch operation.
TableBatchOperation batchOperation = new TableBatchOperation();
foreach(var doc in batch)
{
batchOperation.Delete(doc);
}
// Execute the batch operation.
IList<TableResult> results = await table.ExecuteBatchAsync(batchOperation);
//deal with the results
}
推荐阅读
- python - Python Black hooks(语言:系统)
- conda - 使用配方时如何运行导入测试?(不适用于 bdist_conda)
- c# - Datagrid中的AutoGeneratedColumn事件?
- html - 引导崩溃不起作用,元素不隐藏
- rust - 为什么字符串连接只消耗第一个字符串?
- node.js - Apollo Federation - 处理错误 Entity -> `Entity` 是扩展类型,但 `Entity` 未在任何服务中定义
- javascript - 在heroku中部署时出现typeError
- schema - Shopify 架构 - 获取集合 URL
- java - 动态将 TextView 水平添加到等权线性布局
- html - 带有 jQuery 的菜单中的活动链接不起作用