乍一看,延续令牌在Cosmos DB中的作用很清楚:将其附加到下一个查询会得到下一组结果。但是";下一组结果";确切地说是什么意思?
它的意思是:
- 下一组结果,就好像在第一次查询时原始查询已经完全执行而没有分页一样(跳过适当数量的文档(
- 下一组结果,就好像现在已经执行了原始查询一样(跳过适当数量的文档(
- 完全不同的东西
答案1。考虑到服务器需要存储无限量的状态,这似乎更可取,但不太可能。但答案2。也有问题,因为它可能会导致不一致,例如,如果基础数据在页面查询之间发生了变化,则同一文档可能会在页面之间多次提供。
Cosmos DB查询执行在服务器端是无状态的。continuation令牌用于重新创建索引的状态并跟踪执行进度。
"下一组结果";意味着该查询从"0"开始再次执行;书签";来自上一次执行。此书签由延续令牌提供。
- 在延续过程中创建的文档
根据插入和正在执行的查询的位置,它们可能会返回,也可能不会返回。
示例:
根据c.someValue ASC 从c订单中选择*
让我们假设书签的someValue=10,查询引擎使用someValue=10的延续令牌恢复处理。
如果在查询执行之间插入someValue=5的新文档,则将不会在下一组结果中显示。
如果新文档被插入到";页面";即>书签,它将在下一组结果中显示
- 在延续期间更新的文档
与上述相同的逻辑也适用于更新(参见#4(
- 在继续过程中删除的文档
它们将不会显示在下一组结果中。
- 重复的机会
在以下查询的情况下,
从c订单中选择*,保留库存ASC
如果剩余库存在第一组结果之后更新,并且现在满足第二页的ORDER BY标准,则文档将再次出现。
Cosmos DB不提供跨查询页面的快照隔离。然而,根据产品团队的说法,这是一种非常罕见的情况,因为对连续性的查询非常快速,在大多数情况下,所有查询结果都会在第一页上返回。
根据初步实验,答案似乎是选项#2,或者更准确地说:
- 提供第一页后创建的文档在后续页面上可以观察到
- 提供第一页后更新的文件可在后续页面上查看
- 送达第一页后删除的文件将在后续页面中省略
- 文件从不送达两次
上面的第一句话与来自MSFT的信息相矛盾(参见Kalyan的回答(。如果能从Cosmos DB团队那里得到一个更合格的答案,准确地指定检索页面的语义,那将是一件好事。这对于在UI中显示数据可能不是很重要,但对于后端的数据处理可能是至关重要的,因为在执行查询时似乎没有任何禁用分页的方法(参见Cosmos DB中是否可以进行事务查询?(。
实验方法
我使用Sacha Bruttin的Cosmos DB Explorer查询了一个包含5个文档的集合,因为这个工具可以处理页面大小和其他请求选项。
页面大小设置为1,并启用了跨分区查询。尝试了不同的查询,例如SELECT * FROM c
或SELECT * FROM c ORDER BY c.name
。
检索第1页后,插入了新文档,并更新和删除了一些现有文档(包括应出现在后续页面上的文档(。然后按顺序检索所有后续页面。
(快速查看该工具的源代码,确认未设置ResponseContinuationTokenLimitInKb
。(