首页 > 解决方案 > 删除 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;
            }
        }
    }

问题是我逐行删除日志,这需要很多时间。我可以应用批处理操作逐组删除,但在我的日志表中,所有行都有不同的分区键(我认为这是一个设计错误)。有没有其他方法可以删除多行而不是一一删除,即使所有日志都有不同的分区键?

标签: .netazureloggingazure-cosmosdb

解决方案


这些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
}

推荐阅读