Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure 为什么在Cosmos SQL API查询的WHERE子句中包含分区键会增加某些查询的使用量?_Azure_Azure Cosmosdb_Partitioning_Azure Cosmosdb Sqlapi - Fatal编程技术网

Azure 为什么在Cosmos SQL API查询的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

我想优化我的Azure Cosmos DB SQL API查询,以用于消费RU(部分是为了减少429个响应的频率)

具体地说,我认为在WHERE子句中包含分区键会减少使用量(例如,我读了,这让我想到了这一点)

然而,当我跑的时候

选择前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。