2015-09-29 25 views
1

我上documentdb工作,其使用下面的代碼documentdb - 對.NET SDK查詢大返回結果

var ee =client.CreateDocumentQuery<dynamic>(collection.SelfLink, querySpec) 

我面臨的性能問題,當我執行

ee.ToList(); 

它以性能下降大約1分鐘以上完成700多條記錄。 (如果返回結果更多,則需要更長時間才能完成操作) 如果我在Azure查詢探索上嘗試查詢,則只需幾秒鐘。

有什麼我可以做的,以優化代碼?或者,無論如何,我可以得到返回結果作爲JSON字符串。

謝謝。

+0

我也有可怕的表現從DocumentDB返回一個「大」的結果集。使用引入分區的最新版本的SDK變得更糟。我的這個「大」結果集不會導致SQL Server或Azure表存儲甚至眨眼,但我在DocumentDB中查詢時間超過3分鐘。非常令人沮喪。 – BowserKingKoopa

回答

-1

嘗試增加maxItemCount爲-1​​(最大值),看看有沒有效果表現:

var ee =client.CreateDocumentQuery<dynamic>(collection.SelfLink, querySpec, new FeedOptions { MaxItemCount = -1 }) 

注意,這還不會,因爲它在查詢Explorer運行的原因有兩個一樣快:

  1. 查詢資源管理器在獲取一個頁面後立即返回。通過指定ToList(),您將一直等到所有回報。查詢資源管理器默認爲100而不是-1,因此它會更快地返回。爲了公平比較,請爲您的查詢資源管理器案例增加每頁項目設置。您可能需要考慮爲您的應用程序部署一個分頁方法(使用較小的頁面大小)以部分呈現初始頁面,並使其看起來更具性能。

  2. 其他人已經報告過,我個人在跨越天藍色的數據中心邊界時經歷了每次往返的大延遲。當從同一個數據中心的node.js服務器進行調用時,我得到的延遲小於10毫秒。當使用本地運行的相同代碼時,它至少爲250毫秒。我測量的ping延遲是26ms,所以我假設延遲是在數據中心邊界增加的,而不是我的網絡。您可能需要考慮在與DocumentDB相同的數據中心中運行代碼。

至於返回的JSON字符串,這裏有2.5選項:

  1. 你可能想看看的Node.js(或.NET運行edge.js,這是額外的1/2)。它是原生JavaScript而不是C#,因此它在概念上更接近於DocumentDB。 DocumentDB的.NET API受到範式差異/轉換的影響。請注意,我使用edge.js在.NET中運行node.js。瘋狂,但它的作品。然後,您可以使用DocumentDB node.js庫而不是DocumentDB .NET庫。這給你更多的控制。
  2. 如果您想保持純.NET,您可以使用像RestSharp這樣的包直接訪問DocumentDB REST API。
+0

關於'maxItemCount',現在可以設置爲'-1'來移除頁面大小限制(文檔數量)。你不必忍受只有'1000'。 **注意:**查詢響應仍受響應大小限制(線上字節數)限制。使用投影('SELECT'子句)來減少通過線的字節數。 –

+0

@aliuy,不錯! node.js和服務器端文檔都沒有顯示出這種變化。那是等待還是應該我提交一個拉請求。 –

+0

感謝您的建議,我會嘗試一下。我沒有具體說明maxItemCount的原因是因爲我需要獲取所有記錄以及稍後將用於生成圖形和網格綁定的記錄。 – Teo