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"
}
]
]
}
是否指定顺序是可选的。如果不指定,顺序是升序。
我正在针对数据类型为 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"
}
]
]
}
是否指定顺序是可选的。如果不指定,顺序是升序。