1

何万もの主キーがあり、それらに関連付けられたテーブル エンティティを取得したいと考えています。すべての行キーは空の文字列です。私が知っている最善の方法は、それらを 1 つずつ非同期でクエリすることです。高速に思えますが、理想的には、いくつかのエンティティを 1 つのトランザクションにまとめたいと考えています。新しいストレージ クライアントで遊んでいると、次のコードが失敗します。

var sample = GetSampleIds(); //10000 pks

var account = GetStorageAccount();
var tableClient = account.CreateCloudTableClient();
var table = tableClient.GetTableReference("myTable");

//I'm trying to get first and second pk in a single request.
var keyA = sample[0];
var keyB = sample[1];

var filterA = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, keyA);
var filterB = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, keyB));

//filterAB = "(PartitionKey eq 'keyA') or (PartitionKey eq 'keyB')"
var filterAB = TableQuery.CombineFilters(filterA, TableOperators.Or, filterB);
var query = new TableQuery<TweetEntity>().Where(filterAB);

//Does something weird. I thought it might be fetching a range at one point.
//Whatever it does it doesn't return. Expected the following line to get an array of 2 items.
table.ExecuteQuery(query).ToArray()

// replacing filterAB in query with either filterA or filterB works as expected

例では常に、CombineFilters が PK と RK で機能していることを示していますが、これは私には役に立ちません。これは不可能だと思います。

質問

エンティティを PK でバンドルすることはできますか? フィルターの最大長が 15 であることはわかっていますが、10,000 アイテムを取得する場合は 2 であっても改善される可能性があります。また、説明書はどこにありますか?適切なドキュメントがどこにも見つかりません。たとえば、CombineFilters の MSDN は、Intellisense が提供する情報をより少なくラップする基本的なシェルです。

4

2 に答える 2

4

tl; dr:パーティショニング戦略を再考する必要があるようです。一意の非シーケンシャルIDは、多くのクエリや作業を行う必要がある場合、適切なPKではありません。もっと:

パーティションキーは、実際には「プライマリ」キーを意味するものではありません。それらは、操作したいグループ化された密接に関連したデータのセットとしてより考えられます。ID、日付などでグループ化できます。PKはシステムのスケーリングに使用されます。理論的には、PKごとに1つのパーティションサーバーでデータを処理できます。

あなたの質問に対して:あなたはあなたがしていることをしていると非常に良いパフォーマンスを得ることができません。実際、ORクエリは最適化されておらず、全表スキャンが必要になります(不良)。したがって、PK="foo"またはPK="bar"を実行する代わりに、実際には2つのクエリを(並行して)実行する必要があります。これにより、パフォーマンスが大幅に向上します。

中心的な問題に戻ると、特定のエンティティに一意の識別子を使用していて、それをPKとして記述している場合は、一度に複数のエンティティで作業できないことも意味します。エンティティで作業するには、共通のパーティションキーが本当に必要です。あなたの実体を説明するより良いものを思いつくことができますか?日付/時刻は機能しますか?他の一般的な属性は?それらは良いパーティションキーになる傾向があります。他にできることは、パーティションレンジングと呼ばれるものだけです。この場合、クエリはパーティションキーでレンジングされる傾向があります。この例は、日時パーティションキーです。ファイルティックを使用してパーティションを記述し、最終的にPKとしてシーケンシャルデータティックを作成できます。次に、クエリは>および<クエリを使用して範囲を指定できます(ORなし)。これらはさらに最適化できますが、それでも大量の継続トークンを取得できる可能性があります。

于 2012-11-15T16:35:24.003 に答える
0

dunnry が返信で述べたように、このアプローチの問題は、OR クエリが恐ろしく遅いことです。ストレージ クライアントがなくても問題は解決しました (この時点では、何が問題なのかわかりません。おそらくバグだとしましょう)。 OR クエリで取得するよりも高速です。

于 2012-11-15T17:35:28.087 に答える