DocumentDB在提取大量记录方面比SQL慢吗
本文关键字:方面比 SQL 慢吗 记录 提取 DocumentDB | 更新日期: 2023-09-27 18:20:06
我正在做一些基准测试,所以我有一个包含2500条记录的SQL数据库。我将这些记录插入DocumentDB。
我写了两行代码,其中一行使用实体框架将所有2500个代码拉入C#中的一个数组。下一行将所有2500从DocuementDB中拉入一个数组。
使用的代码:
var test= await Task<Test>.Run(() =>
client.CreateDocumentQuery<Test>(collection.DocumentsLink)
.ToList());
DocumentDB示例耗时超过20秒。SQL Server的行几乎是即时的。这些对象是具有5个属性的简单DTO,我在互联网上进行了SQL查询。
我是否滥用了DocumentDB?我以为这是为了把你所有的记录都记下来,然后加入linq。
@bladefist,您应该能够使用DocumentDB实现更好的性能。例如,看看这个代码存根和来自西欧Azure VM和DocumentDB帐户的输出。
Stopwatch watch = new Stopwatch();
for (int i = 0; i < 10; i++)
{
watch.Start();
int numDocumentsRead = 0;
foreach (Document d in client.CreateDocumentQuery(collection.SelfLink,
new FeedOptions { MaxItemCount = 1000 }))
{
numDocumentsRead++;
}
Console.WriteLine("Run {0} - read {1} documents in {2} ms", i, numDocumentsRead,
watch.Elapsed.TotalMilliseconds);
watch.Reset();
}
//Output
Run 0 - read 2500 documents in 426.1359 ms
Run 1 - read 2500 documents in 286.506 ms
Run 2 - read 2500 documents in 227.4451 ms
Run 3 - read 2500 documents in 270.4497 ms
Run 4 - read 2500 documents in 275.7205 ms
Run 5 - read 2500 documents in 281.571 ms
Run 6 - read 2500 documents in 268.9624 ms
Run 7 - read 2500 documents in 275.1513 ms
Run 8 - read 2500 documents in 301.0263 ms
Run 9 - read 2500 documents in 288.1455 ms
性能方面应遵循的一些最佳实践:
- 使用直接连接和TCP协议
- 如果你是大批量阅读,请使用大页面大小(最大值:1000),以最大限度地减少往返次数
- 为了减少延迟,请在与DocumentDB帐户相同的区域中运行客户端
- 您购买的容量单位的供应吞吐量(和存储)分布在各个集合中。因此,如果你想衡量吞吐量,你应该确保你的应用程序将工作负载分布在所有集合中。例如,如果您购买了1个CU,您可以选择将所有吞吐量分配到单个集合或跨三个集合