用于日期时间的Azure Cosmos DB UDF严重减慢了查询速度



我们的日期存储为:"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();
}

根据这里的第二个答案(由一位在Cosmos工作的MS员工给出(,我应该可以直接进行比较:

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

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

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

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

我建议查看我们处理日期的最佳实践。

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

希望这会有所帮助。

最新更新