Azure 为什么在Cosmos SQL API查询的WHERE子句中包含分区键会增加某些查询的使用量?
我想优化我的Azure Cosmos DB SQL API查询,以用于消费RU(部分是为了减少429个响应的频率) 具体地说,我认为在WHERE子句中包含分区键会减少使用量(例如,我读了,这让我想到了这一点) 然而,当我跑的时候Azure 为什么在Cosmos SQL API查询的WHERE子句中包含分区键会增加某些查询的使用量?,azure,azure-cosmosdb,partitioning,azure-cosmosdb-sqlapi,Azure,Azure Cosmosdb,Partitioning,Azure Cosmosdb Sqlapi,我想优化我的Azure Cosmos DB SQL API查询,以用于消费RU(部分是为了减少429个响应的频率) 具体地说,我认为在WHERE子句中包含分区键会减少使用量(例如,我读了,这让我想到了这一点) 然而,当我跑的时候 选择前1个* 来自c 其中c.Field=“某些值” 和c.PartitionKeyField=“1234” 按c.TimeStampField DESC排序 它消耗6卢比 而没有分区键,例如 选择前1个* 来自c 其中c.Field=“某些值” 按c.TimeSta
选择前1个*
来自c
其中c.Field=“某些值”
和c.PartitionKeyField=“1234”
按c.TimeStampField DESC排序
它消耗6卢比
而没有分区键,例如
选择前1个*
来自c
其中c.Field=“某些值”
按c.TimeStampField DESC排序
它消耗5.76卢比,即更便宜
(虽然根据所选的确切文档,上面的数字有一些变化,但第二个查询总是比较便宜,我已经针对最小和最大分区进行了测试。)
我的数据库目前有大约400000个文档和29个分区(预计两者都会增长)。最大的分区大约有150000个文档(不太可能再增长了)
上面的结果向我表明,我不应该在WHERE子句中为此查询传递分区键。请有人解释一下为什么会这样,因为我认为文档中的情况正好相反。可能有一些原因,这取决于查询引擎决定使用哪个索引,或者是否有索引 我能说的第一件事是,这个容器中可能没有太多数据,因为没有分区键的查询会随着容器的增大而变得越来越昂贵,特别是当它们跨越物理分区时 如果分区键上没有索引,并且在按c字段过滤后对其进行了扫描,那么第一个分区可能会更昂贵 根据是否存在综合指数以及是否使用了综合指数,它的成本也可能会更高 实际上,尽管您不能对小容器使用查询度量并进行推断。测量的唯一方法是将足够的数据放入容器中。这里的数量也很小,不值得再优化。我会将您希望在生产过程中拥有的数据量放入这个容器中,然后重新运行查询 最后,关于测量和优化,帕累托原理适用。每次优化都会让你发疯。找到您的高并发性查询并关注这些查询
希望这会有所帮助。是-这是一个从许多进程同时运行的查询,因此值得优化。我将把分区键保留在WHERE子句中,并随着集合的增长监视查询上的RU。