我有一個Azure Table Store,它包含來自數百個遠程設備的分鐘遙測。數據由連接設備ID,位置ID,年份和年份的鍵分區。所以,作爲一個例子,如果我想爲任何給定的設備拉滿一個月的數據,我需要從30個分區中提取所有數據。建議從Azure表存儲中提取幾千條單獨記錄?
對於一個特定的計算,我只需要記錄在小時的頂部和底部的時間戳,即分鐘分別爲0和30的時間。目前,爲了做到這一點,我創建了一組任務來分別拉取每條記錄並並行抓取它們(一個月的時間是1440年 - 我知道每個記錄的分區鍵和行鍵,因此我可以使用TableOperation.Retrieve < >(partitionKey,rowKey)方法下面的代碼說明了這種方法:
var tasks = new List<Task<TableResult>>();
foreach (var date in dates)
{
foreach (var timeOfDay in checkTimes)
{
var dateTimeLocal = date.Add(TimeSpan.Parse(timeOfDay));
var dateTimeUtc = Helper.ConvertLocalTimeToUtcTime(location.TimeZoneId, dateTimeLocal);
var partitionKey = location.RowKey + "_" + deviceGuid + "_" + dateTimeUtc.DayOfYear + "_" + dateTimeUtc.Year;
var rowKey = dateTimeUtc.ToString("yyyy-MM-ddTHH:mm:00");
var table = TableHelper.GetTable(Data.StorageString, "table");
var retrieveOperation = TableOperation.Retrieve<DataEntities.EnergyData>(partitionKey, rowKey);
tasks.Add(table.ExecuteAsync(retrieveOperation));
}
}
await Task.WhenAll(tasks.ToArray());
var demandData = tasks.Where(c => c.Result.Result != null).Select(c => (DataEntities.EnergyData)c.Result.Result).ToArray();
的日期數組包含午夜的每一天我想要聚合的日期時間,和checkTimes是我感興趣的一天的時間
對於一個月的價值數據(約1440條記錄),這種方法所花費的時間可能比僅僅抽出一個月的每個記錄和在我感興趣的記憶中過濾更長的時間 - 我預計它會更快。
任何想法,爲什麼這個運行如此緩慢(例如它是表存儲節流問題)?有更快更可靠的方法嗎?我開始認爲最好的方法是簡單地將分鐘爲0或30的每行復制到另一個表中,以便我可以在幾個較大的查詢中檢索我需要的內容。
非常感謝您的信息。但是,根據https://docs.microsoft.com/zh-cn/azure/storage/storage-dotnet-how-to-use-tables「在查詢中指定分區和行鍵是檢索來自桌面服務的單一實體「。每個查詢只是檢索一個實體,所以我不認爲你在單個查詢中的約1000+的評論適用於此。我關注1000個以上的單獨查詢,每個查詢都需要一個實體。 – ProfNimrod
我建議您嘗試診斷表服務的指標,並檢查「AverageE2ELatency」和「AverageServerLatency」指標以解決此問題。 –