这是一段代码,用于初始化用于在单个批中检索两行的TableBatchOperation: TableBatchOperation batch = new TableBatchOperation(); batch.Add(TableOperation.Retrieve("somePartition", "rowKey1")); batch.Add(TableOperation.Ret
TableBatchOperation batch = new TableBatchOperation(); batch.Add(TableOperation.Retrieve("somePartition", "rowKey1")); batch.Add(TableOperation.Retrieve("somePartition", "rowKey2")); //second call throws an ArgumentException: //"A batch transaction with a retrieve operation cannot contain //any other operation"
如提到的,抛出异常,并且似乎不支持在单个批中检索N行.
这对我来说很重要,因为我需要每个请求检索大约50行.这个问题是性价比明智的.您可能知道,Azure表存储定价是基于交易量,这意味着50个检索操作比单次批次操作贵50倍.
我错过了什么吗?
边注
我正在使用新的Azure Storage api 2.0.
我注意到这个问题从未在网络上提出过.这个约束可能最近被添加?
编辑
我在这里找到一个相关的问题:Very Slow on Azure Table Storage Query on PartitionKey/RowKey List.
看来,使用TableQuery与rowkeys上的“或”会产生全表扫描.
这里真的是一个严重的问题
>精确的PK和RK
>精确PK,RK范围
> PK范围
> PK范围,RK范围
根据你的意见,我猜你有一些类似的数据:
PK RK Data Guid1 A {Data:{...}, RelatedRows: [{PK:"Guid2", RK:"B"}, {PK:"Guid3", RK:"C"}]} Guid2 B {Data:{...}, RelatedRows: [{PK:"Guid1", RK:"A"}] Guid3 C {Data:{...}, RelatedRows: [{PK:"Guid1", RK:"A"}];}
您已经在Guid1检索了数据,现在您需要加载Guid2和Guid3.我也假设这些行没有共同点,就像他们都是同一个用户一样.考虑到这一点,我会创建一个额外的“索引表”,它可能如下所示:
PK RK Data Guid1-A Guid2-B {Data:{....}} Guid1-A Guid3-C {Data:{....}} Guid2-B Guid1-A {Data:{....}} Guid2-B Guid1-A {Data:{....}}
其中PK是父组合的PK和RK,RK是子行的组合PK和RK.然后,您可以运行一个查询,表示返回所有行,PK =“Guid1-A”,您只需一次调用即可获得所有相关数据(或两个调用).这创建的最大的开销是在你的写作中,所以现在当你连续一行,你也必须为每个相关的行写行,并确保数据保持最新(这可能不是一个问题对于你,如果这是一次写一种场景).
如果我的任何假设是错误的,或者如果您有一些示例数据,我可以用更相关的示例更新此答案.