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。

DocumentDB在提取大量记录方面比SQL慢吗

@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,您可以选择将所有吞吐量分配到单个集合或跨三个集合