我需要知道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的串联,因此仅对精确行匹配和全表排序有用?
答案 0 :(得分:2)
是的,您编写的查询与针对Azure表编写的查询一样高效,它应该使用PartitionKey
和RowKey
的索引。
您的结果可以保证以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;)。