azure 为什么ReadManyItemsAsync执行查询操作,而MS文档说它不在Cosmos中?

4sup72z8  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(97)

根据MS文件,ReadManyItemsAsync应该是最便宜的查找类型,每个项目的RU费用为1。https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/how-to-dotnet-read-item为什么我不仅在直接调用中而且在跟踪中不断看到查询的费用。由于查询的成本至少是读取成本的2.5倍,这是没有意义的。我应该注意到,我在测试中发送了单个id/partitionKey。它应该返回1.xx的费用。我已经完全按照示例所述实现了代码,同时使用了ID和PartitionKeys。

if (ids.Count != partitionKeys.Count)
                throw new ArgumentOutOfRangeException("ids and partitionKey counts must match"); 
            
            var container = Database.GetContainer(containerId); 
            List<(string, PartitionKey)> itemsToFind = new(); 
            for (int i = 0; i < ids.Count(); i++)
            {
                itemsToFind.Add((ids[i],new PartitionKey(partitionKeys[i])));
            }

            var result  = await container.ReadManyItemsAsync<T>(items: itemsToFind);
            return result; 

        }

但是,当我查看该调用时,我发现它使用的是Query,并且向我收取2.95RU的费用。我完全知道它也按有效负载收费。这不是这里的问题。问题是文档说它不执行查询...但我看到了查询。x1c 0d1x所以我想问...这是怎么回事?

slmsl1lt

slmsl1lt1#

根据API文档:https://learn.microsoft.com/dotnet/api/microsoft.azure.cosmos.container.readmanyitemsasync?view=azure-dotnet#remarks
与使用IN语句获取大量独立项的查询相比,它的延迟性能更好。
主要的场景是提供一个比SELECT * FROM c WHERE c.id IN () and c.partitionKey = xx更好的延迟方面的替代方案,如果大多数人知道他们想要读取的一组项目的Id和Partition Key值,他们就会这样做。
这就解释了为什么您会看到查询操作,因为实现内部是优化的查询(与IN查询相比)。
我同意你链接的文档(https://learn.microsoft.com/azure/cosmos-db/nosql/how-to-dotnet-read-item#read-multiple-items-asynchronous)有点误导,因为它说它会做点操作,我们会听取你的反馈,改进措辞和解释,使之更好。

相关问题