【问题标题】:Azure Table Storage - PartitionKey and RowKey selection to use between queryAzure 表存储 - 在查询之间使用的 PartitionKey 和 RowKey 选择
【发布时间】:2011-05-03 02:36:40
【问题描述】:

我是 Azure 的新手!目的是根据存储在 RowKey 中的时间戳返回行。由于每个查询都有交易成本,我想在保持性能的同时尽量减少交易/查询的数量

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

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

传奇

  • AccountId - 是一个整数
  • ParentMessageId - 如果有,则为父 messageId,如果是父则为空
  • DateOfMessage - 创建消息的日期 - 格式为 DateTime.Ticks.ToString("d19")
  • 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)

【问题讨论】:

    标签: performance azure azure-table-storage


    【解决方案1】:

    您的问题的简短回答是肯定的,但您需要注意一些事项。

    Azure 表存储没有 .StartsWith() 的直接等效项。如果您将存储库与 LINQ 结合使用,则可以使用 .CompareTo()(> 和

    如果你用前导 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 小时的成本还要低。

    【讨论】:

    • 感谢 knightpfhor,我更关心的是在表存储上达到 500 trans/sec 会导致节流。我没有考虑 AccountId 的填充,这肯定是需要的。会做一些测试
    • 值得注意的是,油门限制是每个分区,而不是全局的(虽然全局限制是几千trans/sec
    • 关于TextCache_ 我将其添加为表标识符。如果我有多个实体,我将如何区分它们?
    • 您的意思是您尝试将多种类型的实体存储在一个表中?
    • 是的……没错。或者我应该为此创建另一个表......嗯......我想我应该宁愿放入那个常量前缀......
    猜你喜欢
    • 2016-07-27
    • 2012-08-11
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多