繁体   English   中英

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 索引策略中添加范围或复合索引。

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

询问:

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

综合指数:

(age ASC, datetime ASC)

如此的 MS 文档中所述:

注意:添加复合索引时,查询将利用现有的范围索引,直到新的复合索引添加完成。 因此,当您添加复合索引时,您可能不会立即观察到性能改进。 可以使用其中一个 SDK跟踪索引转换的进度。

有关更多详细信息,请查看: 复合索引策略示例使用 Azure 门户更新索引策略

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

指定顺序是可选的。 如果未指定,则顺序为升序。

在此处输入图像描述

使用日期时间

我正在针对一个数据类型为 Datetime 的字段查询数据。

首先,CosmosDB是JSON个文档的文档存储。 JSON 表示法没有数据类型DateTime 如果您查看查询,您实际上是在传递字符串。 如果您查看存储的文档,就会发现您存储的是字符串。 CosmosDB 不知道也不关心它们是否代表您应用程序中的时间点。

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

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

您应该首先阅读以下内容以获取更多详细信息: Working with Dates in Azure Cosmos DB

关于复合索引

这在很大程度上取决于你 model 你的数据,数据分布和优化优先级,但是......

...通常更简单、更通用的单路径索引是首选,因为索引大小更小,可重用性更高。 虽然你可以添加很多复合索引来在特定查询中获得小的收益,但每个添加的索引确实会带来索引维护(插入、更新、删除)+开发维护+索引存储的成本。 DO add only add indexes you actually use and test the RU cost before adding heavy indexes.

另请参阅: Azure Cosmos DB 和 .NET 的性能提示 - 索引策略

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM