我需要知道Azure存储表是否已将RowKey与PartitionKey分开索引,以便进行此类查询…
假设:我的表有论坛帖子PartitionKey = UserEMail, RowKey = PostInstant。因此,我想要这样查询…
SELECT data FROM forum WHERE PartitionKey="user@company.com" AND RowKey < DateLimit;
(注意:我知道PostInstant应该写为"反转",以利用升序排序,从而以降序获得它,这不是重点)。
据我所知,通过显式地指示PartitionKey,查询在性能的道路上走得很好,但之后…RowKey是否会被智能地用于a)给出排序的结果和b)在达到日期限制后停止扫描?
或者,换句话说,Azure存储表索引是否适用于PartitionKey+RowKey的连接,因此仅对精确行匹配和全表排序有用?
是的,你写的查询和你在Azure表上写的查询一样有效,它应该使用PartitionKey
和RowKey
的索引。
您的结果保证以PartitionKey
然后RowKey
的顺序返回。
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'实际上是一个字符串格式的日期(如刻度)。