2016-03-01 61 views
1

我已經編寫了從c#中的wadlogstable獲取最新的診斷日誌,但是它遍歷所有記錄,然後給出最新的條目 前。表格中有5000條記錄,但我只想要最近或最近的1000條記錄 ,但它在給出所有記錄後,通過查詢給出最後的1000條記錄,所以非常耗時,fecth需要將近7-8分鐘4000-5000記錄如何獲取最新的低於1000 WADLogsTable條目?

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ATCommon.DiagnosticConfig); 
     CloudTableClient cloudTableClient = storageAccount.CreateCloudTableClient(); 
     TableServiceContext serviceContext = cloudTableClient.GetDataServiceContext(); 
     IQueryable<WadLogEntity> traceLogsTable = serviceContext.CreateQuery<WadLogEntity>("WADLogsTable"); 
     var selection = from row in traceLogsTable where row.PartitionKey.CompareTo("0" + DateTime.UtcNow.AddHours(hours).Ticks) >= 0 select row; 
     //var selection = from row in traceLogsTable where row.PartitionKey.CompareTo("0" + DateTime.UtcNow.AddMinutes(-5.0).Ticks) >= 0 select row; 
     CloudTableQuery<WadLogEntity> query = selection.AsTableServiceQuery<WadLogEntity>(); 
     IEnumerable<WadLogEntity> output = query.Execute(); 
return output.OrderByDescending(s => s.Timestamp).ToList(); 
+0

什麼是您的分區密鑰?你可以提供樣本數據嗎? – Mahesh

+0

@Mahesh分區鍵是用於過濾目的,以及我在這裏共享的整個代碼。 –

+0

那就是我想說的。 azure表不支持排序,所有使用分區鍵您需要編寫邏輯以獲取最新的100分區鍵作爲索引在您的表中,因此查詢將運行速度快。使用分區鍵過濾器,你需要像先寫邏輯只獲得最後2小時記錄,如果你在這個查詢中只有60個,再試一次,然後填寫你的清單,然後按它排序,只需100 – Mahesh

回答

1

我有超過5億的條目。並且它每秒增加更多..

string apiLogTableName = "yourtableName"; 
StorageTable apiLogsTable = new StorageTable(apiLogTableName); 

string filter1 = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, date); //hear you can check with ticks 


string filter2 = TableQuery.GenerateFilterConditionForInt("yourColumn", QueryComparisons.Equal, yourValue); 

      string filter3 = TableQuery.GenerateFilterCondition("YourColumn2", QueryComparisons.NotEqual, "YourValue2"); 



      TableQuery<ApiCallLogEntity> findapiLogsRecord = new TableQuery<ApiCallLogEntity>().Where(TableQuery.CombineFilters(

       TableQuery.CombineFilters(
          filter1, 
          TableOperators.And, 
          filter2), 
       TableOperators.And, filter3)); 

//you can use 
//var records= apiLogsTable._table.ExecuteQuery(findapiLogsRecord) 


//bellow code will get one-one records // time consuming 
      foreach (ApiCallLogEntity entity in apiLogsTable._table.ExecuteQuery(findapiLogsRecord)) 
      { 
       Console.WriteLine("{0}, {1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey, 
        entity.Action, entity.RequestBody); 


       tw.WriteLine("{0}, {1}\t{2}\t{3}\t{4}", entity.PartitionKey, entity.RowKey, 
        entity.Action, entity.RequestBody, entity.ResponseBody); 
      } 
1

您可以嘗試通過招實現它,使用DateTime.MaxValue.Ticks一個RowKey值 - DateTime.UtcNow.Ticks,讓您從最新的抵消時間對項目進行排序項目到較舊的項目。通過這樣做,您可以按照正確的順序或最近添加的項目檢索結果,然後使用.Take(1000)參數將結果限制爲最近的1000行。 查詢詳情this blog

+0

我已經在使用ticks的東西,但是,如果你在存儲表中有12000條記錄,首先它將獲取所有那麼我們可以做任何類型的過濾,而我不想 –

+0

@AshokDhakhada:如果你過濾表,它將只提取過濾數據,而不是所有數據。只是事情是過濾器應該在分區鍵,所以它不會去扔整個表來搜索正確的數據。它會很快。我張貼我的代碼下面 – Mahesh