我们的日期存储为:"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标准(然后在查询中使用此文本(。
希望这会有所帮助。