Azure cosmosdb 在Azure Cosmos DB中,我是否需要将分区键添加到我的查询where子句中?
我在Azure Cosmos DB中收集了iot消息(称为DeviceEvents)。分区键是应用程序id。我想按设备id进行查询(每个设备只属于一个应用程序)。我有一个这样的问题Azure cosmosdb 在Azure Cosmos DB中,我是否需要将分区键添加到我的查询where子句中?,azure-cosmosdb,Azure Cosmosdb,我在Azure Cosmos DB中收集了iot消息(称为DeviceEvents)。分区键是应用程序id。我想按设备id进行查询(每个设备只属于一个应用程序)。我有一个这样的问题 SELECT VALUE root FROM root WHERE root["ApplicationId"] = 69 AND root["DeviceId"] = 2978 AND root["TimeStamp"] >= &quo
SELECT VALUE root
FROM root
WHERE root["ApplicationId"] = 69 AND root["DeviceId"] = 2978
AND root["TimeStamp"] >= "2021-01-30T20:30:05.1635579Z"
AND root["TimeStamp"] <= "2021-02-19T20:30:05.1635969Z"
ORDER BY root["TimeStamp"] DESC OFFSET 0 LIMIT 30
所以我的问题是
导致查询统计数据混乱的原因是数据量太小,无法提供有意义的结果 对于少量数据(约20GB或更少),您将仅位于单个物理分区上。在同一物理分区上,跨分区查询的运行速度与分区查询一样快 当数据库增长(扩展)时,事情开始爆炸。如果您将数据库设计为具有大量跨分区查询,那么根据设计,您的数据库将无法扩展。因此,您肯定需要(或者应该尽可能多地尝试)在查询中使用分区键,特别是在大容量查询中 我还将在升序和降序复合索引中添加时间戳
您提到的另一件事是,每个设备都属于同一个applicationId。如果是这种情况,那么您的容器不能增长超过20GB。如果此应用程序中的每个设备的applicationId为69,则应重新设计此容器并找到新的分区密钥。如果您的查询总是按设备Id进行的,那么这将是一个更好的分区键。谢谢,我怀疑这一点,但需要再次确认。我现在意识到我说错了。我的意思是每个设备只属于一个应用程序id,而不是每个设备都属于同一个应用程序id。我在选择分区键时考虑了很多,我确实有一些查询,这些查询可以从属于同一应用程序的多个设备获取事件。我也有很多申请。据推测,这些设备将相对均匀地分布。
SELECT VALUE root
FROM root
WHERE root["DeviceId"] = 2978
AND root["TimeStamp"] >= "2021-01-30T20:30:05.1635579Z"
AND root["TimeStamp"] <= "2021-02-19T20:30:05.1635969Z"
ORDER BY root["TimeStamp"] DESC OFFSET 0 LIMIT 30
"compositeIndexes": [
[
{
"path": "/DeviceId",
"order": "ascending"
},
{
"path": "/TimeStamp",
"order": "descending"
}
]