我有一个带有日期字段的集合,该字段由 C# 应用程序使用 DateTime 对象填充。该字段序列化为以下格式“2018-06-10T17:32:48.3285735Z”。
我还没有触及集合中的索引策略,因此字符串使用范围索引类型。从我在文档中读到的内容来看,这是索引日期的最有效方法,但是,当我在 ORDER BY 子句中使用日期字段时,查询消耗的 RU 比使用时间戳查询至少多 10 倍(_ts) 数字字段。这意味着为这个单一系列支付 10 倍的费用。
为了说明这个问题:
SELECT TOP 100 * FROM c ORDER BY c.Date DESC
//query consumes a minimum of 500 RUs
SELECT TOP 100 * FROM c ORDER BY c._ts DESC
//query consumes 50 RUs
这是应该如何工作的还是我错过了什么?我怀疑如果这是预期的行为,那么索引文档中会强调这一点,并且将日期存储为数字将突出显示为最佳实践。
编辑: 这是集合的索引策略(我从未更改过)。
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Range",
"dataType": "String",
"precision": -1
},
{
"kind": "Spatial",
"dataType": "Point"
}
]
}
],
"excludedPaths": []
}
最佳答案
这可能与索引冲突有关(多个值映射到同一索引项)。 您可能想缩小提交日期的范围,看看是否有帮助。基本上,尝试这个查询:
SELECT TOP 100 * FROM c WHERE (c.Date BETWEEN '2000-01-01' AND '2100-01-01') ORDER BY c.Date DESC
请注意,添加的过滤器不应对查询结果集收费。
关于azure - Cosmos DB 日期索引效率不高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50786623/