Azure cosmosdb DocumentDB:内置字符串函数(如UPPER)对性能的影响

Azure cosmosdb DocumentDB:内置字符串函数(如UPPER)对性能的影响,azure-cosmosdb,Azure Cosmosdb,在.NET应用程序中,我们使用DocumentDB SDK查询Azure DocumentDB。 当我们意识到查询中内置的字符串函数似乎对性能有很大影响时,我们试图找到性能问题的原因 我本来打算粘贴从应用程序中获得的一些统计数据,但我已经能够在这里复制游乐场的情况: (单击沙盒选项卡) 使用以下查询: SELECT * FROM food WHERE food.description="Babyfood, dessert, fruit pudding, orange, strained" 我

在.NET应用程序中,我们使用DocumentDB SDK查询Azure DocumentDB。 当我们意识到查询中内置的字符串函数似乎对性能有很大影响时,我们试图找到性能问题的原因

我本来打算粘贴从应用程序中获得的一些统计数据,但我已经能够在这里复制游乐场的情况: (单击沙盒选项卡)

使用以下查询:

SELECT *
FROM food 
WHERE food.description="Babyfood, dessert, fruit pudding, orange, strained"
我得到:

使用
上部
字符串功能:

SELECT *
FROM food 
WHERE UPPER(food.description)=UPPER("Babyfood, dessert, fruit pudding, orange, strained")
我得到:


绝对数字在这里并不重要,在我们的应用程序中,我们在电子邮件字段上应用了
UPPER
,我们看到了很大的不同。无
上限操作需要1s,而无
上限操作需要20s

除了少数例外,任何时候在字段值上使用函数时,都不能使用索引,因此查询将成为一个完整的表扫描。解决这个问题的最佳方法是将值存储在另一个已经较高的字段中,并根据该字段进行查询。或者,如果可以将更高选择性的子句与UPPER()子句结合使用,则会获得更好的性能。

令人惊讶的是,文档中没有提到这一点,它们在查询中列出了使用这些函数的示例。。。在我将您的答案标记为已接受之前,您是否有关于该行为的任何来源/链接?这里是DocumentDB团队成员。当您有一个使用等式(“”)的查询时a@b.com)或范围查询(>=,是的,这是所有数据库的问题。字段上的函数会导致表扫描。感谢您提供更多信息,完美答案。