#.net #azure #logging #azure-cosmosdb
#.net #azure #ведение журнала #azure-CosmosDB
Вопрос:
Я пытаюсь удалить старые журналы 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;
}
}
}
Проблема в том, что я удаляю журналы строка за строкой, и это занимает так много времени. Я мог бы применить пакетную операцию для удаления группы за группой, но в моей таблице журналов все строки имеют разный ключ раздела (я думаю, что это ошибка проектирования).Есть ли какой-либо другой способ удалить несколько строк вместо удаления одной за другой, даже если все журналы имеют разный ключ раздела?
Ответ №1:
ExecuteBatch()
Методы допускают несколько операций удаления с несколькими оговорками, которые потребуют от вас разделения заданий на пакеты перед их выполнением, включая разделение по ключу раздела:
- Не более 100 объектов на запрос
- Каждый объект может появиться только один раз
- Все объекты должны иметь один и тот же ключ раздела
- Общая полезная нагрузка не может превышать 4 Мбайт
- Элемент списка
В этих пределах вы можете смешивать и сопоставлять типы транзакций, чтобы (при желании) удалять, обновлять или вставлять в одном пакете.
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
}