2011-05-03 59 views
5

我是Azure的新手!其目的是基于存储在RowKey中的时间戳返回行。由于存在与每个查询交易成本,我希望尽量减少交易/查询的数量,同时保持性能Azure Table Storage - 查询之间使用的PartitionKey和RowKey选择

这些建议的分区和行键:

  • 分区键: TextCache_(帐户)_(ParentMessageId)
  • 行键:(DateOfMessage)_(的MessageId)

传奇

  • ACCOUNTID - 是一个整数
  • ParentMessageId - 父MESSAGEID如果有一个,空白,如果它是父
  • DateOfMessage - 日期消息的创建 - 格式将是DateTime.Ticks。的ToString(“D19”)
  • 的MessageId - 消息

我想获得从单个查询回行,这是任何childrows>或< DateOfMessage_MessageId的唯一ID

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

即..(在伪代码)

var results = ctx.PartitionKey.StartsWith(TextCache_AccountId) 
    && ctx.RowKey > (TimeStamp)_MessageId 

其次,如果我有多少账户,并只想要回回第10位,可以将它通过一个单一的查询进行

即..(在伪代码)

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

回答

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条消息,则无论帐户2是否有较早的消息,它都将仅返回与帐户1相关的前10条消息。

尽量减少您使用的交易次数是一种很好的做法,不要太在意。运行您的员工/网络角色的成本将会降低您的交易成本。 1,000,000次交易将花费您1美元,这比9小时运行一个小实例的花费少。

+0

谢谢knightpfhor,我更关心的是在表格存储中打500个转/秒,这会导致节流。我没有想到AccountId的填充,这肯定是需要的。将做一些测试 – 2011-05-03 04:03:03

+0

值得注意的是,油门限制是每个分区,而不是全局(尽管全局限制是几千trans/sec – knightpfhor 2011-05-03 04:13:18

+0

关于'TextCache_'我补充说,作为表标识符。如果我有多个实体如何我区分它们吗? – 2011-05-03 04:16:40