Cosmos DB日期索引效率不高

时间:2018-06-10 18:05:27

标签: azure azure-cosmosdb

我有一个带有Date字段的集合,该字段由使用DateTime对象的C#应用​​程序填充。此字段序列化为以下格式“2018-06-10T17:32:48.3285735Z”。

我没有触及集合中的索引策略,因此字符串使用Range索引类型。从我在文档中读到的内容来看,这是索引日期的最有效方法,但是,当我在ORDER BY子句中使用Date字段时,查询消耗的RU比使用时间戳查询的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": []
}

3 个答案:

答案 0 :(得分:0)

这可能与索引冲突有关(多个值映射到相同的索引术语)。 您可能希望缩小提交日期的范围,看看是否有帮助。基本上,请尝试以下查询:

SELECT TOP 100 * FROM c WHERE (c.Date BETWEEN '2000-01-01' AND '2100-01-01') ORDER BY c.Date DESC

请注意,添加的过滤器不应对查询结果集收费。

答案 1 :(得分:0)

您是否尝试过专门配置范围查询?

我认为默认字符串是经过哈希处理的,您必须为范围查询指定索引。

我在文档中找到了这个:

  

默认情况下,Azure Cosmos DB会索引其中的所有字符串属性   文档与哈希索引一致。

Documentation link

用于在集合上设置范围查询索引:

DocumentCollection collection = new DocumentCollection { Id = "orders" }; 

collection.IndexingPolicy = new IndexingPolicy(new RangeIndex(DataType.String) 
                                { Precision = -1 });     

await client.CreateDocumentCollectionAsync("/dbs/orderdb", collection);

他们查询的文件如下:

{
 "id": "09152014101",
 "OrderDate": "2014-09-15T23:14:25.7251173Z",
 "ShipDate": "2014-09-30T23:14:25.7251173Z",
 "Total": 113.39 
}

Documentation link

答案 2 :(得分:0)

我认为当查询使用TOP和ORDER BY时,这是优化方面的不足。我发现,虽然使用时间戳记作为数字和使用时间戳记作为字符串的范围查询的RU差异不大,但是在诸如您这样的场景中,字符串上的范围索引似乎被忽略了。

此处的用户语音问题: https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/32345410-optimise-top-with-order-by-clause-queries