uzu*_*zul 11 azure nosql azure-storage azure-table-storage
这是一段初始化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"
Run Code Online (Sandbox Code Playgroud)
如上所述,抛出异常,并且似乎不支持在单个批处理中检索N行.这对我来说很重要,因为我需要为每个请求检索大约50行.这个问题与成本明智一样具有性能.您可能知道,Azure表存储定价基于事务量,这意味着50个检索操作比单个批处理操作贵50倍.
我错过了什么吗?
旁注 我正在使用新的Azure Storage api 2.0.我注意到这个问题从未在网上提出过.最近可能添加了这个约束吗?
编辑
我在这里找到了一个相关的问题:PartitionKey/RowKey列表上的Azure表存储查询非常慢.似乎在rowkeys上使用带有"或"的TableQuery会产生全表扫描.这里真的有一个严重的问题......
在Azure表存储(ATS)中设计分区密钥(PK)和行密钥(RK)方案时,首要考虑因素应该是如何检索数据.正如您所说的那样,您运行的每个查询都需要花钱,但更重要的是时间,因此您需要在一个有效的查询中获取所有数据.您可以在ATS上运行的有效查询属于以下类型:
根据你的评论我猜你有一些类似的数据:
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"}];}
Run Code Online (Sandbox Code Playgroud)
你已经在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:{....}}
Run Code Online (Sandbox Code Playgroud)
其中PK是父亲的组合PK和RK,而RK是子行的组合PK和RK.然后,您可以运行一个查询,该查询返回PK ="Guid1-A"的所有行,您只需一次调用(或整个调用两次)即可获得所有相关数据.这产生的最大开销是在你的写入中,所以现在当你正确行时,你还必须为每个相关行写入行,并确保数据保持最新(这可能不是问题对于你,如果这是一种写一种情况).
如果我的任何假设是错误的,或者如果您有一些示例数据,我可以使用更相关的示例更新此答案.
Azure 表存储不支持批量“获取”操作。支持的操作有:添加、删除、更新和合并。您需要将查询作为单独的请求来执行。为了更快地处理,您可能希望并行执行这些查询。
| 归档时间: |
|
| 查看次数: |
7311 次 |
| 最近记录: |