当前位置 : 主页 > 网络推广 > seo >

天蓝色 – 不支持使用TableBatchOperation检索多行?

来源:互联网 收集:自由互联 发布时间:2021-06-16
这是一段代码,用于初始化用于在单个批中检索两行的TableBatchOperation: TableBatchOperation batch = new TableBatchOperation(); batch.Add(TableOperation.Retrieve("somePartition", "rowKey1")); batch.Add(TableOperation.Ret
这是一段代码,用于初始化用于在单个批中检索两行的TableBatchOperation:

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上的“或”会产生全表扫描.
这里真的是一个严重的问题

在Azure表存储(ATS)中设计分区密钥(PK)和行密钥(RK)方案时,您的主要考虑因素应该是如何检索数据.正如你已经说过的,你运行的每个查询都花费了两笔钱,但更重要的是时间,所以你需要通过一个有效的查询获得所有的数据.您可以在ATS上运行的高效查询是以下类型:

>精确的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”,您只需一次调用即可获得所有相关数据(或两个调用).这创建的最大的开销是在你的写作中,所以现在当你连续一行,你也必须为每个相关的行写行,并确保数据保持最新(这可能不是一个问题对于你,如果这是一次写一种场景).

如果我的任何假设是错误的,或者如果您有一些示例数据,我可以用更相关的示例更新此答案.

网友评论