DocumentDB:内置字符串函数(如 UPPER)的性能影响
DocumentDB: Performance impact of built-in string functions (like UPPER)
在我们的 .NET 应用程序中,我们使用 DocumentDB SDK 来查询我们的 Azure DocumentDB。
当我们意识到查询中的内置字符串函数似乎对性能有很大影响时,我们试图找出性能问题的原因。
我本来打算粘贴一些我从我们的应用程序中获得的统计数据,但我已经能够在此处使用 playground 复制这种情况:
https://www.documentdb.com/sql/demo(单击沙盒选项卡)
使用以下查询:
SELECT *
FROM food
WHERE food.description="Babyfood, dessert, fruit pudding, orange, strained"
我得到:
并使用 UPPER
字符串函数:
SELECT *
FROM food
WHERE UPPER(food.description)=UPPER("Babyfood, dessert, fruit pudding, orange, strained")
我得到:
绝对数字在这里并不重要,在我们的应用程序中,我们在电子邮件字段上应用 UPPER
,我们看到了很大的不同。没有 UPPER
操作需要 1 秒,而有它需要 20 秒!
除了少数例外,任何时候对字段值使用函数时,它都不能使用索引,因此查询变成了完整的 table 扫描。解决此问题的最佳方法是将值存储在另一个已经 UPPER 的字段中并对其进行查询。或者,如果您可以将更具选择性的子句与 UPPER() 子句结合使用,您将获得更好的性能。
在我们的 .NET 应用程序中,我们使用 DocumentDB SDK 来查询我们的 Azure DocumentDB。 当我们意识到查询中的内置字符串函数似乎对性能有很大影响时,我们试图找出性能问题的原因。
我本来打算粘贴一些我从我们的应用程序中获得的统计数据,但我已经能够在此处使用 playground 复制这种情况: https://www.documentdb.com/sql/demo(单击沙盒选项卡)
使用以下查询:
SELECT *
FROM food
WHERE food.description="Babyfood, dessert, fruit pudding, orange, strained"
我得到:
并使用 UPPER
字符串函数:
SELECT *
FROM food
WHERE UPPER(food.description)=UPPER("Babyfood, dessert, fruit pudding, orange, strained")
我得到:
绝对数字在这里并不重要,在我们的应用程序中,我们在电子邮件字段上应用 UPPER
,我们看到了很大的不同。没有 UPPER
操作需要 1 秒,而有它需要 20 秒!
除了少数例外,任何时候对字段值使用函数时,它都不能使用索引,因此查询变成了完整的 table 扫描。解决此问题的最佳方法是将值存储在另一个已经 UPPER 的字段中并对其进行查询。或者,如果您可以将更具选择性的子句与 UPPER() 子句结合使用,您将获得更好的性能。