为什么在 Cosmos SQL API 查询的 WHERE 子句中包含分区键会增加某些查询消耗的 RU?
Why does including partition key in WHERE clause to Cosmos SQL API query increase consumed RUs for some queries?
我想优化我的 Azure Cosmos DB SQL API 查询消耗的 RU(部分是为了减少 429 响应的频率)。
具体来说,我认为在 WHERE 子句中包含分区键会减少消耗的 RU(例如,我阅读 https://docs.microsoft.com/en-us/azure/cosmos-db/optimize-cost-queries and https://docs.microsoft.com/en-us/azure/cosmos-db/partitioning-overview 这让我想到了这一点)。
然而,当我运行
SELECT TOP 1 *
FROM c
WHERE c.Field = "some value"
AND c.PartitionKeyField = "1234"
ORDER BY c.TimeStampField DESC
消耗6个RU
而没有分区键,例如
SELECT TOP 1 *
FROM c
WHERE c.Field = "some value"
ORDER BY c.TimeStampField DESC
它消耗 5.76 RU - 即更便宜。
(虽然根据所选的确切文档,上述数字会有所不同,但第二个查询总是更便宜,我已经针对最小和最大分区进行了测试。)
我的数据库目前有大约 400,000 个文档和 29 个分区(预计都会增加)。最大的分区有大约 150,000 个文档(不太可能增长得比这更多)。
以上结果告诉我,我不应该在这个查询的 WHERE 子句中传递分区键。请有人解释为什么会这样,因为我认为相反的文档应该是正确的?
可能有几个原因,这取决于查询引擎决定使用哪个索引,或者是否有索引。
我可以说的第一件事是,此容器中可能没有太多数据,因为没有分区键的查询随着容器的增大而变得越来越昂贵,尤其是当它们跨越物理分区时。
如果分区键上没有索引并且在 c.field 过滤后对其进行扫描,第一个可能会更昂贵。
根据是否有复合索引以及是否使用它,它也可能更昂贵。
实际上,您不能对小容器获取查询指标并进行推断。衡量的唯一方法是将足够的数据放入容器中。此外,这里的数量非常小,不值得优化。我会把你希望在生产中拥有的数据量放入这个容器中,然后重新运行你的查询。
最后,关于衡量和优化,帕累托原则适用。你会疯狂地追逐每一个优化。找到您的高并发查询并专注于这些查询。
希望对您有所帮助。
我想优化我的 Azure Cosmos DB SQL API 查询消耗的 RU(部分是为了减少 429 响应的频率)。
具体来说,我认为在 WHERE 子句中包含分区键会减少消耗的 RU(例如,我阅读 https://docs.microsoft.com/en-us/azure/cosmos-db/optimize-cost-queries and https://docs.microsoft.com/en-us/azure/cosmos-db/partitioning-overview 这让我想到了这一点)。
然而,当我运行
SELECT TOP 1 *
FROM c
WHERE c.Field = "some value"
AND c.PartitionKeyField = "1234"
ORDER BY c.TimeStampField DESC
消耗6个RU
而没有分区键,例如
SELECT TOP 1 *
FROM c
WHERE c.Field = "some value"
ORDER BY c.TimeStampField DESC
它消耗 5.76 RU - 即更便宜。
(虽然根据所选的确切文档,上述数字会有所不同,但第二个查询总是更便宜,我已经针对最小和最大分区进行了测试。)
我的数据库目前有大约 400,000 个文档和 29 个分区(预计都会增加)。最大的分区有大约 150,000 个文档(不太可能增长得比这更多)。
以上结果告诉我,我不应该在这个查询的 WHERE 子句中传递分区键。请有人解释为什么会这样,因为我认为相反的文档应该是正确的?
可能有几个原因,这取决于查询引擎决定使用哪个索引,或者是否有索引。
我可以说的第一件事是,此容器中可能没有太多数据,因为没有分区键的查询随着容器的增大而变得越来越昂贵,尤其是当它们跨越物理分区时。
如果分区键上没有索引并且在 c.field 过滤后对其进行扫描,第一个可能会更昂贵。
根据是否有复合索引以及是否使用它,它也可能更昂贵。
实际上,您不能对小容器获取查询指标并进行推断。衡量的唯一方法是将足够的数据放入容器中。此外,这里的数量非常小,不值得优化。我会把你希望在生产中拥有的数据量放入这个容器中,然后重新运行你的查询。
最后,关于衡量和优化,帕累托原则适用。你会疯狂地追逐每一个优化。找到您的高并发查询并专注于这些查询。
希望对您有所帮助。