【问题标题】:Azure Cosmos DB UDF for date time is seriously slowing down query日期时间的 Azure Cosmos DB UDF 严重减慢查询速度
【发布时间】:2020-07-21 11:02:35
【问题描述】:

我们的日期存储为:"2/22/2008 12:00:00 AM"。我们需要过滤结果,以便在两次之间获取文档。

如果我们比较两个查询,一个使用 UDF,另一个不使用,使用 UDF 的查询要慢几个数量级。

与:

SELECT DISTINCT 
    c.eh, c.wcm, w AS wt 
FROM 
    c 
    JOIN w IN c.wt 
WHERE 
    (udf.toValue(w.ced) BETWEEN udf.toValue('03/02/2023') AND udf.toValue('09/02/2023'))
    AND w.ty = 'FW' 
OFFSET 0 
LIMIT 10

没有:

SELECT DISTINCT 
    c.eh, c.wcm, w AS wt 
FROM 
    c 
    JOIN w IN c.wt 
WHERE 
    w.ty = 'FW' 
OFFSET 0 
LIMIT 10

这是 UDF:

function userDefinedFunction(datestr){
    return new Date(datestr).getTime();
}

根据the second answer here(一位在 Cosmos 工作的 MS 员工)我应该可以直接比较:

(w.ced BETWEEN '03/02/2023' AND '09/02/2023')

但这会返回 0 个结果。我对 Cosmos 非常陌生。如何优化此查询?我应该补充一下,wt/ced 上已经有一个 idex。

【问题讨论】:

    标签: azure-cosmosdb user-defined-functions


    【解决方案1】:

    一般来说,如果您可以使用系统函数而不是 UDF,性能会好得多。

    但是,在这种情况下,您应该以一致的格式保存日期,以避免每次都必须使用 UDF 来修复它们。

    我建议查看我们的best practices for working with dates

    如果您能够在 Cosmos DB 中以一致的格式存储日期(推荐格式遵循 ISO 8601 UTC 标准),那么您可以避免需要在查询本身中转换格式(这会很昂贵)。如果需要,任何数据格式转换都应在应用程序内完成。例如,在运行查询之前将日期“03/02/2023”转换为 ISO 8601 UTC 标准(然后在查询中使用此文本)。

    希望这有帮助。

    【讨论】:

    • 谢谢马克。我们得出了同样的结论。无法使用当前日期格式修复查询。我们需要修复数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多