首页 > 解决方案 > FeedResponse 是否包含来自单个逻辑分区的结果?

问题描述

我一直在使用 Azure SDK for .NET(带有核心 3.1)客户端通过在容器上调用 GetItemQueryIterator() 来查询集合。

我观察到 GetItemQueryIterator 返回的 FeedIterator 返回的 FeedResponses 对应于物理分区,但我在文档中没有找到任何确认。

有人可以确认:

如果上述陈述不正确,是否对分区(逻辑和/或物理)与 FeedIterators 和 FeedResponses 之间的关系有任何保证?

谢谢!

标签: azure-cosmosdb

解决方案


TL;DR - 可以肯定的是,如果您不指定分区键,您的结果将是给定分区范围的结果的聚合。

重要的是要记住,在大多数情况下,逻辑到物理分区的映射被视为实现细节,尽管在实践中这是一个灰色区域(大多数人可以安全地忽略的灰色区域)。此外,随着改进的进行,查询的机械工作方式会发生很大的变化(尽管在功能上它不应该改变),但是代码是从 SDK 方面开源的,所以我至少可以像你一样描述时间点从任何 SDK 实现中查看。

如果您提供分区键,答案很简单——您的结果一次来自一个物理分区。每次都可能不同(尽管在实践中,它会是相同的范围),因为分区可以在查询之间拆分。您的查询也可能每次都由不同的副本提供服务。上述情况适用于所有类型的单分区定位查询。

跨分区查询变得更加有趣。总的来说,跨分区查询通过一个管道,该管道根据查询计划合并结果。因此 order by 查询将从物理分区到物理分区抓取页面,直到它们有足够的时间来确保保持排序。聚合做类似的事情/等等。这当然会带来在提供结果之前必须与多个分区对话的开销,以及客户端为服务请求而消耗的资源的更多开销,因此我们不建议在热路径代码中使用繁重的跨分区查询(保存它作为物化视图等)。在某些情况下,它会跳过此管道,并且每个响应对应于通过网络提供的页面,但通常只是简单的 where 子句。


推荐阅读