为什么分区的 DocumentDB collection 中总是有 "round trip"?

Why is there always "round trip" in partitioned DocumentDB collection?

我正在向分区的 DocumentDB collection 发出如下请求。 collection 已分区以供将来使用,但此时分区键只有一个值。

{ "query": "SELECT * FROM r where r.id = @id", "parameters": [ {"name": "@id", "value": "4a97b4fe-cbf7-4e7c-be50-e90d3ce7bc14"} ] }

第一页 returns 空白,其中 x-ms-continuation#PKRID:1。当我浏览下一页指定不同的 x-ms-continuation header 时,最终 #PKRID:16 周围的正确 body returns(第 16 页)。好像在DocumentDB portal里面叫"round trip",因为每次分页都需要网络往返。

问题:

  1. 这是正常现象吗?查询指定 "id",因此我认为它应该能够从索引中即时获取记录。如果我没记错的话,当我将 collection 作为单个分区时,它确实在第一页中得到了结果。

  2. 如果这是(不幸的)DocumentDB 的正常行为,我可以做些什么来减轻往返效应?将 x-ms-max-item-count 指定为较大的数字(如 1000)没有任何效果。同样的记录仍在第 16 页返回。 (其实这个collectionreturns第16页好像每条记录都...)

作为补充资料,索引策略是这样的:

{ "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*", "indexes": [ { "kind": "Range", "dataType": "Number", "precision": -1 }, { "kind": "Range", "dataType": "String", "precision": -1 }, { "kind": "Spatial", "dataType": "Point" } ] } ], "excludedPaths": [] }

在 DocumentDB 中,过滤分区键的查询将在单个 hop/partition 中执行,但不过滤分区键的查询将在每个分区上执行(在每个分区中,查询命中索引)。

请注意,在分区集合中,文档的 "primary key" 是 (, "id") 的复合 属性,而不仅仅是 "id"。例如,如果您的分区键是 "appName",那么您应该过滤 "appName = X" 以执行单跳查询。 "appName = X and id = Y" 上的查询是主键查找。

另请注意,在 SDK 1.9.0+ 中,DocumentDB 支持并行执行跨分区查询。即使查询没有分区键过滤器,并行查询执行也允许您以非常低的延迟执行查询。