我可能(可能)做这一切都是错误的,结果大不相同。但是我在使用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。
在第一个循环中,我只是请求文档的单个属性,它是时间戳。 (我开始尝试实现一个非常天真的缓存startegy)而另一个循环返回完整的文档。
这是输出:
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服务中。
任何人都知道为什么让时间戳到处都是这样吗?为什么第一次读取的文件是500毫秒,而其余的几乎是2000毫秒?
您可以在与您的DocumentDB相同的数据中心运行此模块,而不是在模拟器本地运行该模块吗?我知道你说这个问题是存在的,但我认为如果你的数据来自于生产环境,更多的人会对帮助感兴趣。 –
我也建议关闭节流的重试。初始化DocumentClient时,将ConnectionPolicy.RetryOptions.MaxRetryAttemptsOnThrottle = 0设置为消除任何节流变化。 –
此外,如果您可以将收集内容共享到[email protected],我们可以调试/分析并将结果发布回SO。 –