Azure表存储 - 在查询之间使用的PartitionKey和RowKey选择

Jas*_*ong 6 performance azure azure-table-storage

我是Azure的新手!目的是根据存储在RowKey中的时间戳返回行.由于每个查询都有交易成本,我希望在保持性能的同时最小化事务/查询的数量

这些是建议的分区和行键:

  • 分区键: TextCache_(AccountID)_(ParentMessageId)
  • 行键:(DateOfMessage)_(MessageId)

传奇:

  • AccountId - 是一个整数
  • ParentMessageId - 父消息ID(如果有),如果是父消息,则为空
  • DateOfMessage - 消息创建日期 - 格式为DateTime.Ticks.ToString("d19")
  • MessageId - 消息的唯一ID

我想从单个查询返回行和任何>或<DateOfMessage_MessageId的子项

这可以通过我提出的PartitionKeys和RowKeys来完成吗?

ie ..(在伪代码中)

var results = ctx.PartitionKey.StartsWith(TextCache_AccountId) 
   && ctx.RowKey > (TimeStamp)_MessageId
Run Code Online (Sandbox Code Playgroud)

其次,如果我有多个帐户,并且只想返回前10个帐户,可以通过单个查询完成

ie ..(在伪代码中)

var results = ( 
      ( 
        ctx.PartitionKey.StartsWith(TextCache_(AccountId1)) && 
            && ctx.RowKey > (TimeStamp1)_MessageId1 )
      )
      ||
      ( 
        ctx.PartitionKey.StartsWith(TextCache_(AccountId2)) && 
            && ctx.RowKey > (TimeStamp2)_MessageId2 )
      ) ... 
          )
         .Take(10)
Run Code Online (Sandbox Code Playgroud)

kni*_*hor 5

对你的问题的简短回答是肯定的,但有些事情你需要注意.

Azure表存储没有直接等效的.StartsWith().如果您将存储库与LINQ结合使用,则可以使用.CompareTo()(>和<不正确翻译),这意味着如果您运行搜索帐户1并且您要求查询返回1000个结果,但是帐户1只有600个结果,最后400个结果将是帐户10(词汇下一个帐号).因此,您需要对如何处理结果有所了解.

如果你用前导0填充帐户ID,你可以做这样的事情(这里也是伪代码)

ctx.PartionKey > "TextCache_0000000001"
&& ctx.PartitionKey < "TextCache_0000000002"
&& ctx.RowKey > "123465798"
Run Code Online (Sandbox Code Playgroud)

别的东西要牢记的是,查询到Azure的表返回他们的结果PartitionKey,然后RowKey顺序.所以在你的情况下,没有a的消息ParentMessageId将在消息之前返回ParentMessageId.如果您永远不会查询此表,ParentMessageId我会将其移至属性.

如果TextCache_只是一个字符串常量,它不会通过包含在其中添加任何内容,PartitionKey除非这实际上意味着返回时代码.

虽然您将进行第二次查询,但我认为它不会产生您所追求的内容.如果你想按DateOfMessage顺序排列前十行,那么它将不起作用(参见我上面关于排序顺序的观点).如果您按原样运行此查询并且帐户1有11条消息,则它将仅返回与帐户1相关的前10条消息,无论帐户2是否具有较早的消息.

虽然尝试最小化您使用的交易数量是一种良好的做法,但不要太在意它.运行工作人员/ Web角色的成本将使您的交易成本相形见绌.1,000,000笔交易将花费您1美元,这比9小时运行一个小实例的成本要低.