行キーのコレクション (1 つのパーティション内) によって、いくつかのエンティティを検索する必要があります。それを行うための適切なクエリは何ですか?
3 に答える
何を最適化するかによって異なります。複数の行キーを指定すると、それらがすべて同じパーティションにある場合でも、パーティション スキャンが発生することがわかりました。クエリ オプティマイザーは、OR クエリを処理するには十分ではありません。パーティションのサイズにもよりますが、パーティションのスキャンには数十ミリ秒から数百ミリ秒かかります。ポイント クエリよりも常に低速です。
速度を最適化したい場合は、各クエリを個別に実行する必要があります。タスク並列ライブラリを使用せず、begin/end 関数を使用すると、スケーリングが大幅に向上します。
待ち時間が問題にならない場合は、OR クエリを実行します。遅くなりますが、1 回のトランザクションとしてカウントされるため、料金は安くなります。
行キーのみによるクエリの問題(元の質問を暗示していると解釈しています):その行キーはどのパーティションにも存在する可能性があるため、テーブルスキャンを実行することになります。そして、これらのクエリを個別に実行すると、それぞれに対してテーブル スキャンを実行することになります (元の質問へのコメントで @GlennFerrieLive が示唆しているように、Task Parallel Library を使用しても)。
(この記事$filter
で説明されているように) 行キーの範囲を指定するか、または行キーの個別のリスト (フィルター内で 15 個の個別の比較に制限されています) を指定できます。これは 1 回のテーブル スキャンで終わるはずですが、それでも... テーブル スキャンです。
クエリでパーティションキーを指定できる場合は、そうする必要があります。これにより、クエリがはるかに高速に返されます。あなたが保存しているデータの量がわからないので、はるかに高速です。
EDIT : コメントによる更新ごとに、partitionkey を知っているので、単一のフィルター内で行キーの範囲または個別の行キーを指定する上記のガイダンスに従うことができます。または...さらに多くの行キーがある場合は、フィルターごとに単一の行キーとして、または範囲またはフィルター処理されたリストにグループ化して、TPL を介してこれらを実行することを検討できます (テーブル スキャンがないことを考えると、これは理にかなっています)。