我是Azure的新手!目的是根据存储在RowKey中的时间戳返回行。由于每个查询都有交易成本,我希望在保持性能的同时最小化交易/查询的数量
这些是建议的分区和行键:
图例:
我想从单个查询中返回行和任何> gt的子项。或者< DateOfMessage_MessageId
可以通过我提议的PartitionKeys和RowKeys来完成吗?
ie ..(在伪代码中)
var results = ctx.PartitionKey.StartsWith(TextCache_AccountId)
&& ctx.RowKey > (TimeStamp)_MessageId
其次,如果我有多个帐户,并且只想返回前10个帐户,可以通过单个查询完成吗
ie ..(在伪代码中)
var results = (
(
ctx.PartitionKey.StartsWith(TextCache_(AccountId1)) &&
&& ctx.RowKey > (TimeStamp1)_MessageId1 )
)
||
(
ctx.PartitionKey.StartsWith(TextCache_(AccountId2)) &&
&& ctx.RowKey > (TimeStamp2)_MessageId2 )
) ...
)
.Take(10)
答案 0 :(得分:5)
对你的问题的简短回答是肯定的,但有些事情你需要注意。
Azure表存储没有直接等效的.StartsWith()
。如果您将存储库与LINQ结合使用,则可以使用.CompareTo()
(>和<不正确翻译),这意味着如果您运行搜索帐户1并且您要求查询返回1000个结果,但帐户1只有600个结果,最后400个结果将用于帐户10(词汇下一个帐号)。因此,您需要对如何处理结果有所了解。
如果您使用前导0填充帐户ID,则可以执行此类操作(此处也为伪代码)
ctx.PartionKey > "TextCache_0000000001"
&& ctx.PartitionKey < "TextCache_0000000002"
&& ctx.RowKey > "123465798"
要记住的其他事项是对Azure表的查询会以PartitionKey
然后RowKey
顺序返回结果。因此,在您使用ParentMessageId
的邮件之前,将返回没有ParentMessageId
的邮件。如果您永远不会通过ParentMessageId
查询此表格,我会将其移至属性。
如果TextCache_
只是一个字符串常量,那么它不会通过包含在PartitionKey
中添加任何内容,除非这实际上意味着代码在返回时会有所作为。
虽然您将进行第二次查询,但我认为它不会产生您所追求的内容。如果您想要DateOfMessage
订单中的前十行,那么它将无法工作(请参阅上面关于排序顺序的观点)。如果您按原样运行此查询并且帐户1有11条消息,则它将仅返回与帐户1相关的前10条消息,无论帐户2是否有早先的消息。
尽管尝试最小化您使用的交易数量是一种很好的做法,但不要太在意它。运行工作人员/ Web角色的成本将使您的交易成本相形见绌。 1,000,000笔交易将花费您1美元,这比9小时运行一个小实例的成本要低。