Azure存储表是否将RowKey单独编入索引以利用子分区查询?

时间:2011-09-27 22:11:11

标签: indexing azure azure-table-storage

我需要知道Azure存储表是否已将RowKey与PartitionKey分开编入索引,以便进行此类查询...

假设:我的桌子有论坛帖子有PartitionKey = UserEMail,RowKey = PostInstant。所以,我想这样查询...

SELECT data FROM forum WHERE PartitionKey="user@company.com" AND RowKey < DateLimit;

(注意:我知道PostInstant应该被写成“反向”以利用升序排序,从而以降序获得它,这不是重点。)

据我了解,通过显式指示PartitionKey,查询在性能路径上进行得很好,但之后......将智能地使用RowKey来a)给出排序结果和b)到达后停止扫描DateLimit?

或者,换句话说,Azure存储表索引是否适用于PartitionKey + RowKey的串联,因此仅对精确行匹配和全表排序有用?

2 个答案:

答案 0 :(得分:2)

是的,您编写的查询与针对Azure表编写的查询一样高效,它应该使用PartitionKeyRowKey的索引。

您的结果可以保证以PartitionKey然后RowKey顺序返回。

答案 1 :(得分:2)

PartitionKey和RowKey是您可以使用的唯一索引属性。但是,您只在问题中使用一个。因此,您的查询将搜索整个PartitionKey'user@company.com'而无需任何其他索引。如果它是一个小分区,这可能不是什么大问题。如果它是一个大的,那么你也应该使用RowKey。请注意,在指定名为“PostInstant”的属性时,这与RowKey不同。您必须专门查询RowKey(即使它与另一个列名相同)。

所以你的查询会更像这样:

ctx.CreateQuery<Foo>('tablename').Where(s => s.PartitionKey == "user@company.com" && s.RowKey.Compare(DateLimit) > 0);

我当然假设'DateLimit'实际上是一个字符串格式化日期(如刻度线)。如果您反转刻度的顺序,您也会反转比较运算符(&gt;)。