DocumentDB 的分区键

Partition key for DocumentDB

我对 DocumentDB 分区键选择有疑问。 我有 UserId、DeviceId 和 WhateverId 的数据。 UserId 参数将始终在查询中,因此我选择了 UserId 作为分区键。但是我有一个用户(数百万个实体)的大量数据,当我使用指定的分区键进行 "SELECT * FROM c WHERE c.DeviceId = @DeviceId" 之类的查询时,它会花费很多时间(大约 220 000 个返回的实体大约需要 6 分钟)。 也许选择 DeviceId 作为分区键并并行查询几个分区会更有效 (指定 EnableCrossPartitionQuery = true 和 MaxDegreeOfParallelism = 分区计数)? 或者为每个用户使用单独的集合是个好主意?

这可能会有一点帮助,但我认为为每个用户划分一个分区并不能解决您的问题,因为您基本上已经将其隐藏起来了。

您可以尝试使用分区键来提高并行度,但根据我的经验,最多只能将您提高 2 到 5 倍。够了吗?

要获得更显着的改进,您通常必须求助于选择性反规范化 and/or 缓存。

我知道这有点老了,但是为了其他人的利益来到这个话题...

根据您的描述,我认为这些设备对用户来说大多是独一无二的。通常建议根据 userid 之类的东西进行分区,如果你有一个呼叫中心应用程序,这很好,对给定的 userid 有很多查询并且想要查找不超过几百个条目。在这种情况下,可以从单个分区中快速提取数据,而无需跨分区整理数据的开销。但是,如果您有数百万条用户记录,那么根据用户 ID 进行分区可能是最糟糕的选择,因为从单个分区中提取大量数据很快就会超过整理的开销。在这种情况下,您希望在所有分区上尽可能均匀地分布用户数据。除非每个用户都有 25 台以上使用情况相似的设备,否则设备 ID 可能也不是一个好的选择。

在像您这样的情况下,我通常会发现系统生成的递增密钥(例如事件 ID 或交易 ID)是最佳选择。