我有一个cosmos DB,其大小约为100GB。 我成功创建了一个不错的分区键,在70M条记录上有大约4600个分区,但是我仍然需要查询两个以字符串形式存储的datetime字段,而不是以纪元格式存储。
示例json:
"someField1": "UNKNOWN",
"someField2": "DATA",
"endDate": 7014541201,
"startDate": 7054864502,
"someField3": "0",
"someField3": "0",
我注意到当我执行select * from tbl
和执行select * from tbl where startDate > {someDate} AND endDate<{someDate1}
时的延迟大约是1s,因此此过滤不会减少我的延迟时间。
将日期类型存储为数字更好吗?宇宙在时代查询范围内是否具有更好的性能?
我正在使用SQL API。
此外,当我尝试在startDate和endDate上添加哈希索引时,他基本上将其转换为两个索引。 示例:
"path": "/startDate/?",
"indexes": [
{
"kind": "Hash",
"dataType": "String",
"precision": 3
}
]
},
此转换为
"path": "/startDate/?",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Range",
"dataType": "String",
"precision": -1
}
]
这是正常行为还是与我的数据有关? 谢谢。
我检查了查询指标,对于4k条记录,对cosmosDB的查询在100毫秒内执行。我想问你
var option = new FeedOptions { PartitionKey = new PartitionKey(partitionKey), MaxItemCount = -1};
var query= client.CreateDocumentQuery<MyModel>(collectionLink, option)
.Where(tl => tl.StartDate >= DateTimeToUnixTimestamp(startDate) && tl.EndDate <= DateTimeToUnixTimestamp(endDate))
.AsEnumerable().ToList();
此查询在10到12秒钟内返回1万个结果(在邮递员中约为9MB)?该分区包含大约5万条记录。
检索到的文档数:12,356
检索的文档大小:12,963,709字节
输出文档数:3,633
输出文档大小:3,819,608字节
索引利用率:29.00%
查询总执行时间:264.31 毫秒查询编译时间:0.12毫秒
逻辑计划构建时间:0.07毫秒
身体计划的建立时间:0.06毫秒
查询优化时间:0.01毫秒
索引查找时间:51.10毫秒
文档加载时间:140.51毫秒
运行时执行时间
查询引擎时间:55.61毫秒
系统功能执行时间:0.00毫秒
用户定义的函数执行时间:0.00毫秒
文档写入时间:10.56毫秒
客户端指标
重试计数:0
Request Charge : 904.73 RUs
答案 0 :(得分:1)
我来自CosmosDB工程团队。
由于您的馆藏有7,000万条记录,因此我认为观察到的延迟仅在结果的第一次往返(或第一页)上。请注意,执行查询时,也可以通过将FeedOptions.MaxDegreeOfParallelism调整为-1来改善观察到的延迟。
关于两个查询本身的区别,请注意,不带过滤器的SELECT *是完全扫描查询,可能有点 与带有两个过滤器的其他查询相比,它更快地首次返回结果,这对所有分区的本地索引做了更多的工作,这可以解释观察到的延迟。
关于您的其他问题,我们不再支持新集合的哈希索引政策。请在此处查看:https://docs.microsoft.com/en-us/azure/cosmos-db/index-types#index-kind。我们会自动将Hash索引完全精确地转换为Range。
您还可以获取查询的QueryMetrics并分析结果以找出延迟的原因。详细信息在这里:https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-query-metrics#query-execution-metrics