2017-06-21 19 views
-2

我有一個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的每行復制到另一個表中,以便我可以在幾個較大的查詢中檢索我需要的內容。

回答

0

由於Query Entities狀態:

對陣表服務的查詢可以在一個時間最大1000個實體的返回,可以執行最多的五秒鐘。如果結果集包含超過1,000個實體,如果查詢未在五秒內完成,或者查詢跨越分區邊界,則響應將包含包含一組連續標記的自定義標題。繼續令牌可以用於構建對下一頁數據的後續請求。

根據您的場景,您已指定partitionKeyrowKey檢索單個記錄。根據我的理解,在這一點上,您的客戶端將發送1000多個針對表服務的請求,而對於Partition Range ScanRow Range Scan,它只會發送幾個請求。

我認爲當您使用點查詢(使用相等謂詞指定單個PartitionKey和RowKey)時,它可能會導致網絡延遲。你可以enable azure storage metrics你的表存儲,並通過Microsoft Azure Storage Explorer檢查AverageE2ELatencyAverageServerLatency指標如下:

enter image description here

有關表存儲指標的詳細信息,你可以參考Transactions Table Schema

任何想法,爲什麼這個運行如此緩慢(例如它是表存儲節流問題)?有更快更可靠的方法嗎?我開始認爲最好的方法是簡單地將分鐘爲0或30的每行復制到另一個表中,以便我可以在幾個較大的查詢中檢索我需要的內容。

按我的理解,你可以通過指定每月的範圍(例如rowKey>="2016-06-01T00:00:00" and rowKey<="2016-06-30T23:59:59")中的RowKey檢索記錄指定設備,然後在內存中過濾的的,你希望利用Row Range Scan

+0

非常感謝您的信息。但是,根據https://docs.microsoft.com/zh-cn/azure/storage/storage-dotnet-how-to-use-tables「在查詢中指定分區和行鍵是檢索來自桌面服務的單一實體「。每個查詢只是檢索一個實體,所以我不認爲你在單個查詢中的約1000+的評論適用於此。我關注1000個以上的單獨查詢,每個查詢都需要一個實體。 – ProfNimrod

+0

我建議您嘗試診斷表服務的指標,並檢查「AverageE2ELatency」和「AverageServerLatency」指標以解決此問題。 –