2015-09-17 53 views
0

我有一個有超過一百萬個條目的Azure表,我試圖以編程方式在C#中執行大約300,000個查詢,以便將一些數據傳輸到另一個系統。目前,我做以下,我通過具有分區和行密鑰的文件中讀取:執行大量Azure表查詢的最佳方法?

while (!reader.EndOfStream) 
{ 
    // parse the reader to get partition and row keys 
    string currentQuery = TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partKey), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, rowKey)); 
    TableQuery<MyEntity> query = new TableQuery<MyEntity>().Where(currentQuery); 

    foreach (MyEntity entity in table.ExecuteQuery(query)) 
    { 
     Console.WriteLine(entity.PartitionKey + ", " + entity.RowKey + ", " + entity.Timestamp.DateTime); 
    } 

    Thread.Sleep(25); 
} 

這走的是一條很長的時間才能完成(5+小時)。從我所能看到的查詢平均大約需要200毫秒。我對Azure很陌生,所以我認爲我做錯了什麼。我該如何改進它?

+0

建議:從Azure中導出數據庫並將其放到本地SQL Server上。然後運行你的代碼,看看它是否更快。 – mrunion

+1

@mrunion - 這個建議的確與回答這個問題無關。 –

回答

2

有幾件事情:

  1. 不知道爲什麼你在你的循環睡眠通話。除非你受到限制(存儲支持每秒20,000次交易),否則你不應該這樣做。
  2. 使用給定的分區鍵和行鍵,您只能得到一個返回的實體(因爲組合pk + rk是唯一的)。無需循環查看結果。你會得到零或一個。
  3. 您正在採用單線程方法,因此您很難將存儲事務處理速度推得很低。考慮平行你的檢索。
  4. 我假設你沒有在你的實際應用中調用Console.Writeline()。如果是這樣,這也會讓你放慢腳步。
  5. 考慮禁用Nagle的算法,通過ServicePointManager.UseNagleAlgorithm = false;。否則,單個低級別存儲調用可能會被緩存到500ms,以便更密集地打包tcp數據包。如果您花費週期來處理您閱讀的內容,這將非常重要。
+0

感謝您的回答。至於並行我的代碼,什麼是這樣做的最好方法?我曾嘗試使用線程池,但是我的整體運行時並沒有真正改變。 –