1

我有一堆主键 - 数万个,我想检索它们关联的表实体。所有行键都是空字符串。我知道这样做的最好方法是一一异步地查询它们。它看起来很快,但理想情况下我想在一个事务中将几个实体捆绑在一起。使用新的存储客户端,我有以下代码失败:

var sample = GetSampleIds(); //10000 pks

var account = GetStorageAccount();
var tableClient = account.CreateCloudTableClient();
var table = tableClient.GetTableReference("myTable");

//I'm trying to get first and second pk in a single request.
var keyA = sample[0];
var keyB = sample[1];

var filterA = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, keyA);
var filterB = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, keyB));

//filterAB = "(PartitionKey eq 'keyA') or (PartitionKey eq 'keyB')"
var filterAB = TableQuery.CombineFilters(filterA, TableOperators.Or, filterB);
var query = new TableQuery<TweetEntity>().Where(filterAB);

//Does something weird. I thought it might be fetching a range at one point.
//Whatever it does it doesn't return. Expected the following line to get an array of 2 items.
table.ExecuteQuery(query).ToArray()

// replacing filterAB in query with either filterA or filterB works as expected

示例总是显示 CombineFilters 在 PK 和 RK 上工作,但这对我没有用。我假设这是不可能的。

问题

是否可以通过 PK 将实体捆绑在一起?我知道过滤器的最大长度是 15,但是当您获取 10,000 个项目时,即使是 2 也是一个潜在的改进。另外,说明书在哪里?在任何地方都找不到合适的文档。例如,用于 CombineFilters 的 MSDN 是一个基本的 shell,包含了智能感知提供的较少信息。

4

2 回答 2

4

tl; dr:听起来您需要重新考虑分区策略。当您通常需要查询或处理多个 ID 时,唯一的、非连续的 ID 并不是好的 PK。更多的:

分区键并不意味着真的是“主”键。它们更多地被认为是您想要使用的分组的、密切相关的数据集。您可以按 id、日期等进行分组。PK 用于扩展系统 - 理论上,每个 PK 可以有 1 个分区服务器处理您的数据。

对于您的问题:您正在做的事情不会有很好的表现。事实上,OR 查询是非优化的,需要全表扫描(不好)。所以,不要做 PK = "foo" OR PK = "bar",你真的应该做 2 个查询(并行),因为这会让你获得更好的性能。

回到您的核心问题,如果您使用特定实体的唯一标识符并将其描述为 PK,那么这也意味着您一次无法处理超过 1 个实体。为了在实体上工作,您确实需要一个公共分区键。你能想出一个更好的描述你的实体的方法吗?日期/时间有效吗?其他一些共同属性?这些往往是很好的分区键。您唯一可以做的另一件事是所谓的分区范围 - 您的查询往往在分区键上进行范围。这方面的一个例子是日期时间分区键。您可以使用文件记号来描述您的分区,并以 PK 的顺序数据记号结束。然后,您的查询可以使用 > 和 < 查询来指定范围(无 OR)。这些可以更优化,但你仍然可能会获得大量的延续令牌。

于 2012-11-15T16:35:24.003 回答
0

正如 dunnry 在他的回复中提到的那样,这种方法的问题是 OR 查询非常慢。我在没有存储客户端的情况下解决了我的问题(在这一点上,我不确定它有什么问题,假设它可能是一个错误),但是在没有 OR 查询的情况下单独获取 2 个实体结果很多(!)比使用 OR 查询更快。

于 2012-11-15T17:35:28.087 回答