在拉大量记录时,DocumentDB是否比SQL慢?

时间:2014-09-01 00:48:33

标签: c# azure azure-cosmosdb

我正在做一些基准测试,所以我有一个包含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,我通过Internet进行了SQL查询。

我是否误用了DocumentDB?我认为这是为了将你的所有记录都记录到内存然后加入linq。

1 个答案:

答案 0 :(得分:15)

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