Azureテーブルストレージ - テーブルスキャンはどれくらい速くなりますか?
-
27-10-2019 - |
質問
誰もが、Azure Table Storage(ATS)のRowkeyまたはPartitionKey以外のものに対して質問しないように警告します。しばらくの間、これは私を麻痺させ、正確なPKとRKを思いついて、他の何かを照会する必要があるときに他のテーブルに擬似系インデックスを作成しようとしました。
ただし、適切だと思ったときに、SQL Serverで一般的にテーブルスキャンすることがあります。
質問は、Azureテーブルをどのくらい速くテーブルスキャンできるかということです。これはエンティティ/秒の定数ですか、それともレコードサイズなどに依存します。応答性の高いアプリケーションが必要な場合、テーブルスキャンにはいくつかのレコードが多すぎるかについての経験ルールがありますか?
解決
テーブルスキャンの問題は、パーティションの境界を越えることに関係しています。保証されているパフォーマンスのレベルは、パーティションレベルで設定された説明です。したがって、フルテーブルスキャンを実行すると、a)あまり効率的ではありません。b)パフォーマンスの保証はありません。これは、パーティション自体が個別のストレージノードに設定されており、クロスパーティションスキャンを実行すると、潜在的に大量のリソースを消費するためです(複数のノードを同時に結びつける)。
これらの境界を越える効果は、結果を取得するためにストレージに追加のラウンドトリップを必要とする継続トークンも生じると信じています。これにより、パフォーマンスが低下し、トランザクションカウントの増加(およびその後のコスト)が発生します。
交差しているパーティション/ノードの数がかなり小さい場合、問題に気付かないでしょう。
しかし、これについて私を引用しないでください。私はAzureストレージの専門家ではありません。それは実際には、私が最も知識のない紺ureの領域です。 :p
他のヒント
ブレントはお金が100%であると思いますが、それでもあなたがそれを試してみたいと思っているなら、私は自分自身を見つけるためにいくつかのテストを実行することを提案することができます。パフォーマンスキラーであるため、パーティションの交配を防ぐために、クエリにパーティションキーを含めてください。
Azureテーブルは、テーブルスキャン用に最適化されていません。テーブルのスキャンは、長期にわたるバックグラウンドジョブには受け入れられる可能性がありますが、迅速な応答が必要な場合はそれを行いません。妥当なサイズのテーブルを使用すると、クエリがパーティション境界に達するか、1Kの結果を取得するため、継続トークンを処理する必要があります。
Azure Storageチームには スケーラビリティのターゲットを説明する素晴らしい投稿. 。単一のテーブルパーティションのスループットターゲットは500エンティティ/秒です。ストレージアカウントの全体的な目標は5,000トランザクション/秒です。
答えはページネーションです。使用 top_size
- 結果の結果またはレコードの最大数 - と連携して next_partition_key
と next_row_key
継続トークン。これにより、パフォーマンスに大きな要因の違いが発生します。 1つは、結果が統計的に単一のパーティションから生じる可能性が高いことです。平易な結果は、セットがパーティションの継続キーによってグループ化され、行の継続キーではなくグループ化されていることを示しています。
つまり、UIまたはシステム出力についても考える必要があります。最大50の結果が10〜20を超えることを気にしないでください。ユーザーはおそらくこれ以上使用したり調べたりしないでしょう。
愚かに聞こえます。 Googleで「犬」を検索し、検索が10個のアイテムのみを返すことに注意してください。もういや。 「続行」を押すことを気にする場合、次のレコードが利用できます。調査では、その最初のページを超えてほとんどユーザーベンチャーがないことが証明されています。
select
(キー価値のサブセットを返す)違いが生じる可能性があります。たとえば、使用します select
= "PartitionKey,RowKey"
また 'Name'
あなたが必要とする最小限は何でも。
「これらの境界を越える効果は、継続トークンにもつながると信じています。これにより、結果を取得するためにストレージに追加のラウンドトリップが必要です。これにより、パフォーマンスの低減、およびトランザクションカウントの増加(およびその後のコスト)の結果が得られます。 。」
...わずかに間違っています。継続トークンは、交差境界のためではなく、Azureテーブルが1000以下の結果を許可しているために使用されます。したがって、2つの継続トークンが次のセットに使用されます。デフォルトのtop_sizeは基本的に1000です。
あなたの視聴のために、Azure Python APIのクエリエンティティの説明を次に示します。他の人はほとんど同じです。
'''
Get entities in a table; includes the $filter and $select options.
table_name: Table to query.
filter:
Optional. Filter as described at
http://msdn.microsoft.com/en-us/library/windowsazure/dd894031.aspx
select: Optional. Property names to select from the entities.
top: Optional. Maximum number of entities to return.
next_partition_key:
Optional. When top is used, the next partition key is stored in
result.x_ms_continuation['NextPartitionKey']
next_row_key:
Optional. When top is used, the next partition key is stored in
result.x_ms_continuation['NextRowKey']
'''