の場合、私は多分これをすべて間違っているかもしれません。しかし、私はDocumentDbを使用してWebアプリケーションで奇妙な結果を出した後、簡単なベンチマークを作成しました。"ベンチマーク" documentdb
var id = "62734c17-e939-43bd-8719-08e4c7b51f75";
var client = new DocumentClient(new Uri(LocalDbConfig.Endpoint),LocalDbConfig.Key);
var sw = new Stopwatch();
var collectionLink = UriFactory.CreateDocumentCollectionUri(LocalDbConfig.DatabaseId,
LocalDbConfig.CollectionId);
var tsResults = new List<long>();
var docResults = new List<long>();
for (int i = 0; i < 10; i++)
{
sw.Restart();
var result = client.CreateDocumentQuery(collectionLink, $"select c._ts from c where c.id = \"{id}\"").AsEnumerable().FirstOrDefault()._ts;
sw.Stop();
tsResults.Add(sw.ElapsedMilliseconds);
Console.WriteLine($"TS: {sw.ElapsedMilliseconds}");
}
for (int i = 0; i < 10; i++)
{
sw.Restart();
var doc = client.CreateDocumentQuery(collectionLink).Where(q => q.Id == id).AsEnumerable().FirstOrDefault();
sw.Stop();
docResults.Add(sw.ElapsedMilliseconds);
Console.WriteLine($"DOC: {sw.ElapsedMilliseconds}");
}
Console.WriteLine($"TS: Average: {tsResults.Average()} - Longest: {tsResults.Max()} - Shortest: {tsResults.Min()}");
Console.WriteLine($"DOC: Average: {docResults.Average()} - Longest: {docResults.Max()} - Shortest: {docResults.Min()}");
Console.ReadLine();
これは、C#コンソールアプリのMain()
機能です。私が要求しているドキュメントは約5MBのJSONです。
最初のループでは、ドキュメントの1つのプロパティを要求しています。タイムスタンプです。 (私は非常に素朴なキャッシングの開始を実装するためにこれを始めました)そしてもう一つのループは完全なドキュメントを返します。
これが出力されます:
TS: 1450
TS: 17
TS: 18
TS: 22
TS: 548
TS: 156
TS: 532
TS: 174
TS: 519
TS: 182
DOC: 557
DOC: 1725
DOC: 1916
DOC: 1868
DOC: 1876
DOC: 1832
DOC: 1861
DOC: 1851
DOC: 1881
DOC: 1870
TS: Average: 361,8 - Longest: 1450 - Shortest: 17
DOC: Average: 1723,7 - Longest: 1916 - Shortest: 557
あなたが見ることができるように、タイムスタンプを返すことは、すべての場所にあるが、完全な文書を返すことは最初の要求後に安定の一種である、なぜ最初の要求であります残りの部分よりも400%速く、どちらもわかりません。
このテストはDocumentDbエミュレータで実行されますが、元の問題はAzure DocumentDbサービスにも存在しています。
なぜタイムスタンプを取得するのがいいのでしょうか?そして、なぜドキュメントの最初のフェッチが500msですか、残りはほぼ2000msですか?
エミュレータではなく、DocumentDBと同じデータセンターから実行できますか?私はあなたが問題が存在すると言っていることを知っていますが、あなたのデータが実稼働環境からのものであれば、より多くの人々が手助けをすることになると思います。 –
スロットルをオフにして再試行することをおすすめします。 DocumentClientを初期化するときは、ConnectionPolicy.RetryOptions.MaxRetryAttemptsOnThrottle = 0を設定して、スロットルからの変化を排除します。 –
また、コレクションの内容を[email protected]に共有することができれば、デバッグ/分析して調査結果をSOに返すことができます。 –