Windows Azure テーブル ストア クエリがどのようにスケーリングされるかを評価したいと考えています。この目的のために、テーブル内のデータ量を増やし、クエリの実行時間を測定できる簡単なテスト環境をまとめました。時間に基づいて、将来のクエリのパフォーマンスを評価するために使用できるコスト関数を定義したいと思います。
次のクエリを評価しました。
- PartitionKey と RowKey を使用したクエリ
- PartitionKey と属性を使用したクエリ
- PartitionKey と 2 つの RowKey を使用したクエリ
- PartitionKey と 2 つの属性を使用したクエリ
最後の 2 つのクエリでは、次の 2 つのパターンを確認しました。
- PartitionKey == "..." && (RowKey == "..." || RowKey == "...")
- (PartitionKey == "..." && RowKey == "...") || (PartitionKey == "..." && RowKey == "...")
転送の遅延を最小限に抑えるために、Azure インスタンスでテストを実行しました。測定値から、私はそれを見ることができます
- クエリ 1 (当然のことながら、テーブルはこれらのフィールドに基づいてインデックスが作成されているため) は非常に高速です。テーブルに約 150000 のエントリがある場合、約 10 ~ 15 ミリ秒です。
- クエリ 2 はパーティション スキャンを必要とするため、実行時間は格納されたデータに比例して増加します。
- クエリ 3.1 はクエリ 2 とほぼ同じように実行されます。そのため、このクエリもフル パーティション スキャンで実行されますが、これは少し奇妙に思えます。
- クエリ 4.1 は、クエリ 3.1 よりも 2 倍以上遅くなります。そのため、2 つのパーティション スキャンで評価されているようです。
- 最後に、クエリ 3.2 と 4.2 は、クエリ 2 よりもほぼ正確に 4 倍遅くなります。
クエリ/フィルター インタープリターの内部について説明できますか? クエリ 3.1 にパーティション スキャンが必要であることを認めたとしても、クエリ 4.1 も同じロジックで (同時に) 評価できます。クエリ 3.2 と 4.2 は、私にとって謎のようです。それらに関する指針はありますか?
明らかに、これの要点は、パフォーマンスを失わずにコストを最小限に抑えるために、1 つのクエリ内で個別の要素をクエリしたいということです。しかし、要素ごとに (Task Parallel Library を使用して) 個別のクエリを使用することが唯一の高速なソリューションのようです。これを行うための受け入れられた方法は何ですか?