我正通过Azure .NET SDK弄乱Azure Cosmos DB,发现有些奇怪。
通常,当我使用连续令牌逐页请求查询时,我从不会获得在创建第一个连续令牌之后创建的文档。我可以观察到已更改的文档,缺少已删除(或新过滤出的文档)的文档,但没有新文档。 但是,如果我只允许使用1kB连续令牌(可以设置的最小令牌),那么我也将获得新文档。很显然,只要它们最终排序到其余页面即可。
这是有道理的,因为有大小限制,所以我阻止Cosmos DB在连续令牌中包括序列化索引查找和其他内容。缺点是,Cosmos DB必须为我请求的每个页面重新创建恢复状态,这将花费一些额外的RU。至少根据this discussion。副作用是,新文档最终出现在结果中。
现在,我实际上对此有两个疑问。
答案 0 :(得分:3)
我来自CosmosDB工程团队。
由于客户的要求,我们引入了此功能(限制了连续令牌的大小),以帮助减少响应的连续大小。我们认为,太多细节无法揭示修剪连续性的影响,因为对于大多数客户而言,微妙的行为更改无关紧要。
这取决于从索引生成状态所完成的工作量。例如,如果我们必须评估范围谓词(例如_ts>一些离散的秒),则保存的RU可能很重要,因为我们有可能避免扫描与_ts对应的整堆索引键(这可以是O(文档),假设最坏的情况是每秒最多插入1个文档)。在这种情况下,假设有X个连续,我们可以节省(X-1)* O(文档数)个工作量。
否,除非您通过将标头设置为1强制CosmosDB对每个连续进行重新评估索引,否则通常不会在连续上相当快地执行查询,因此用户看到新文档的机会应该很小。理想情况下,我们应该实现快照隔离以从第一个延续中检索带有会话令牌的结果,但是我们还没有这样做。
您的假设在:)