我有一个Cosmos DB集合,其中包含基于设备ID的多个分区。我经常遇到需要通过特定设备ID检索最新文档的用例。我目前正在使用DocumentDB API中提供的SELECT TOP 1
功能,如下所示:
SELECT TOP 1 *
FROM c
WHERE c.deviceId = 5
ORDER BY c.timeStamp DESC
这种方法导致RU / s消耗增加,并且随着集合和单个分区的大小增加而降低性能,正如人们所期望的那样。作为此问题的临时补救措施,我添加了其他where子句,以按时间戳限制查询范围:
SELECT TOP 1 *
FROM c
WHERE c.deviceId = 5
AND c.timeStamp >= 1506608558 --timestamps are unix/epoch based to optimize indexing
AND c.timeStamp <= 1506694958
ORDER BY c.timeStamp DESC
我想知道是否有更好的方法按分区ID选择最新文档,因为添加此where子句可能会导致意外或缺少结果。
答案 0 :(得分:2)
我有一个类似的情况,我跟踪的资产的ID形成我的分区密钥,并且在该分区内,每个资产每天有2,880个事件,并且这将随着时间的推移而继续增长。
虽然其他用例需要完整的事件历史记录,但此特定用例需要提取最新事件。因此创建了一个使用相同分区键的备用Collection,但包含CURRENT状态,即该资产的最新事件。
当一个事件被写入WRITE Side时,作为保存资产所有事件的集合,触发器会使用最新值更新READ端。
虽然这可能会使写入工作量增加一倍,但在我们的用例中,读取端的性能提升弥补了这一点。
我发现这篇MS文章有用Working with the change feed support in Azure Cosmos DB