6

私は Azure のまったくの初心者です。目的は、RowKey に格納されているタイムスタンプに基づいて行を返すことです。クエリごとにトランザクション コストが発生するため、パフォーマンスを維持しながらトランザクション/クエリの数を最小限に抑えたい

提案されたパーティションと行キーは次のとおりです。

  • パーティション キー: TextCache_(AccountID)_(ParentMessageId)
  • 行キー: (DateOfMessage)_(MessageId)

凡例:

  • AccountId - 整数です
  • ParentMessageId - 存在する場合は親 messageId、親の場合は空白
  • DateOfMessage - メッセージが作成された日付 - 形式は DateTime.Ticks.ToString("d19") になります
  • MessageId - メッセージの一意の ID

> または < DateOfMessage_MessageId である行と子行を単一のクエリから取得したいと思います

これは、提案した 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)
4

1 に答える 1

5

あなたの質問に対する簡単な答えは「はい」ですが、注意が必要な点がいくつかあります。

Azure テーブル ストレージには、 に直接相当するものはありません.StartsWith()。ストレージ ライブラリを LINQ と組み合わせて使用​​している場合は、.CompareTo()(> と < は適切に変換されません) を使用できます。つまり、アカウント 1 の検索を実行し、クエリで 1000 件の結果を返すように要求すると、アカウント 1 の結果は 600 件のみで、最後の 400 件の結果はアカウント 10 (字句的に次のアカウント番号) の結果になります。そのため、結果をどのように処理するかについて、少し賢くする必要があります。

アカウント ID の先頭に 0 を追加すると、次のようなことができます (ここでも疑似コード)。

ctx.PartionKey > "TextCache_0000000001"
&& ctx.PartitionKey < "TextCache_0000000002"
&& ctx.RowKey > "123465798"

他に覚えておくべきことは、Azure テーブルへのクエリはその順序で結果を返すということPartitionKeyですRowKey。したがって、あなたの場合、のないParentMessageIdメッセージは、のメッセージの前に返されますParentMessageId。このテーブルにクエリを実行しない場合はParentMessageId、これをプロパティに移動します。

TextCache_が単なる文字列定数の場合、返されたときに実際にコードに何かを意味しない限り、に含まれても何も追加されませんPartitionKey

2 番目のクエリが実行されますが、求めている結果が得られるとは思いません。最初の 10 行を順番に並べたい場合は、うまくいきDateOfMessageません (並べ替え順序については、上記のポイントを参照してください)。このクエリをそのまま実行し、アカウント 1 に 11 件のメッセージがあった場合、アカウント 2 に以前のメッセージがあったかどうかに関係なく、アカウント 1 に関連する最初の 10 件のメッセージのみが返されます。

使用するトランザクションの数を最小限に抑えることは良い方法ですが、あまり気にする必要はありません。ワーカー/Web ロールを実行するコストは、トランザクション コストを小さくします。1,000,000 件のトランザクションで 1 ドルかかりますが、これは 1 つの小さなインスタンスを 9 時間実行するコストよりも低くなっています。

于 2011-05-03T03:58:14.653 に答える