Удаление строк таблицы Azure

#.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
}