azure-cosmosdb - FeedResponse 是否包含来自单个逻辑分区的结果?
问题描述
我一直在使用 Azure SDK for .NET(带有核心 3.1)客户端通过在容器上调用 GetItemQueryIterator() 来查询集合。
我观察到 GetItemQueryIterator 返回的 FeedIterator 返回的 FeedResponses 对应于物理分区,但我在文档中没有找到任何确认。
有人可以确认:
- 如果查询中未指定分区键值,FeedIterator 将为集合中的每个物理分区返回一个 FeedResponse?
- 如果指定了分区键值,FeedIterator 将只返回一个 FeedResponse,其结果来自保存指定逻辑分区的物理分区?
如果上述陈述不正确,是否对分区(逻辑和/或物理)与 FeedIterators 和 FeedResponses 之间的关系有任何保证?
谢谢!
解决方案
TL;DR - 可以肯定的是,如果您不指定分区键,您的结果将是给定分区范围的结果的聚合。
重要的是要记住,在大多数情况下,逻辑到物理分区的映射被视为实现细节,尽管在实践中这是一个灰色区域(大多数人可以安全地忽略的灰色区域)。此外,随着改进的进行,查询的机械工作方式会发生很大的变化(尽管在功能上它不应该改变),但是代码是从 SDK 方面开源的,所以我至少可以像你一样描述时间点从任何 SDK 实现中查看。
如果您提供分区键,答案很简单——您的结果一次来自一个物理分区。每次都可能不同(尽管在实践中,它会是相同的范围),因为分区可以在查询之间拆分。您的查询也可能每次都由不同的副本提供服务。上述情况适用于所有类型的单分区定位查询。
跨分区查询变得更加有趣。总的来说,跨分区查询通过一个管道,该管道根据查询计划合并结果。因此 order by 查询将从物理分区到物理分区抓取页面,直到它们有足够的时间来确保保持排序。聚合做类似的事情/等等。这当然会带来在提供结果之前必须与多个分区对话的开销,以及客户端为服务请求而消耗的资源的更多开销,因此我们不建议在热路径代码中使用繁重的跨分区查询(保存它作为物化视图等)。在某些情况下,它会跳过此管道,并且每个响应对应于通过网络提供的页面,但通常只是简单的 where 子句。
推荐阅读
- javascript - 我怎样才能得到一个复选框值?
- xslt - XML 输出,元素值作为标签名称,下一个后续元素值作为创建标签的值
- sql-server - 列存储索引创建失败并出现此错误“资源池'默认'中没有足够的内存来运行此查询”
- spring-boot - 如何将用户 bean 的可选列表传递给 JsonParser 以生成 PDF
- selenium - 如何定位桌面应用程序的 XPATH
- c# - Visual Studio 2019 winforms 自定义控件设计器问题
- python - 有没有办法将文件中的列表设置为字典中的值
- django - 如何在 Django 视图中访问多项目索引模型?
- swift - if/switch 语句用于创建类实例或创建空变量
- f# - 如何创建一个可以测试另一个函数的随机单词共现的函数?