Azure Cosmos 按范围查询日期

Azure Cosmos Query against Date By Range

我正在针对数据类型为 Datetime 的一个字段查询数据,例如我的查询如下所示,

Select * from c where c.datetime >= '19/04/2021' and c.datetime <= '23/04/2021'and c.age = 25

读取数据时没有问题,但它花费了太多时间和 RU。

有人可以通过给我一个示例代码来建议我或帮助我在上述查询的 cosmos 索引策略中添加范围或复合索引。

使用日期时间

I am querying data against one field where the datatype is Datetime..

首先,CosmosDB 是 JSON 文档的文档存储。 JSON notation does NOT have a data type DateTime。如果您查看查询,您实际上是在传递字符串。如果您查看存储的文档,就会发现您存储的是字符串。 CosmosDB 不知道也不关心它们是否代表您应用程序中的时间点。

因此,查询(和索引)中日期时间的顺序不是按时间顺序排列的,而是按字面顺序排列的。不过,您很可能想要前者。

要使带有日期时间的字符串可索引为时间,您必须使用文字顺序和时间顺序相同的格式。通常为 ISO-8601.

您应该首先阅读此内容以了解更多详细信息: Working with Dates in Azure Cosmos DB.

关于复合索引

这在很大程度上取决于您如何建模数据、数据分布和优化优先级,但是...

... 通常首选更简单、更通用的单路径索引,因为索引大小更小,可重用性更高。虽然你可以添加很多复合索引来在特定查询中获得小的收益,但每个添加的索引确实会带来索引维护(插入、更新、删除)+开发维护+索引存储的成本。请只添加您实际使用的索引,并在添加较重的索引之前测试 RU 成本。

另请参阅:Performance tips for Azure Cosmos DB and .NET - Indexing policy

当您有一个慢速或高请求单位 (RU) 查询时,您可以使用复合索引对其进行优化。默认情况下,没有定义复合索引,因此您必须根据需要添加复合索引。

查询:

Select * from c where c.age = 25 and c.datetime >= '19/04/2021' and c.datetime <= '23/04/2021';

综合指数e:

(age ASC, datetime ASC)

如 MS 文档中所述 here:

Note: When you add a composite index, the query will utilize existing range indexes until the new composite index addition is complete. Therefore, when you add a composite index, you may not immediately observe performance improvements. It is possible to track the progress of index transformation by using one of the SDKs.

更多详情请查看:Composite indexing policy examples and Updating indexing policy using the Azure portal

{  
        "automatic":true,
        "indexingMode":"Consistent",
        "includedPaths":[  
            {  
                "path":"/*"
            }
        ],
        "excludedPaths":[],
        "compositeIndexes":[  
            [  
                {  
                    "path":"/age"
                },
                {  
                    "path":"/datetime"
                }
            ]
        ]
}

是否指定顺序是可选的。如果不指定,顺序是升序。