DynamoDB でのスキャンの使用 - Amazon DynamoDB

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

DynamoDB でのスキャンの使用

AScanAmazon DynamoDB は、テーブルまたはセカンダリインデックスのすべての項目を読み込みます。デフォルトでは、Scan オペレーションはテーブルまたはインデックスのすべての項目のデータ属性を返します。ProjectionExpression パラメータを使用し、Scan がすべての属性ではなく一部のみを返すようにできます。

Scan は常に結果セットを返します。一致する項目がない場合、結果セットは空になります。

1 つのデータScanリクエストで、最大 1 MB のデータを取得できます。必要に応じて、DynamoDB はこのデータにフィルタ式を適用して、結果をユーザーに返す前に絞り込むことができます。

Scan のフィルタ式

Scan 結果の絞り込みが必要な場合は、オプションでフィルタ式を指定できます。フィルタ式によって、Scan 結果の返される項目が決まります。他のすべての結果は破棄されます。

フィルタ式は、Scan の完了後、結果が返される前に適用されます。そのため、Scan は、フィルタ式があるかどうかにかかわらず、同じ量の読み込みキャパシティーを消費します。

AScanオペレーションで、最大 1 MB のデータを取得できます。この制限は、フィルタ式を評価する前に適用されます。

Scanでは、パーティションキー属性やソートキー属性など、フィルター式で任意の属性を指定できます。

フィルタ式の構文は、条件式の構文と同じです。フィルタ式は、条件式と同じコンパレータ、関数および論理演算子を使用できます。詳細については, 条件式.

以下の AWS Command Line Interface (AWS CLI) の例は、Threadテーブルを作成し、特定のユーザーによって最後に投稿された項目のみを返します。

aws dynamodb scan \ --table-name Thread \ --filter-expression "LastPostedBy = :name" \ --expression-attribute-values '{":name":{"S":"User A"}}'

結果セットの項目数の制限

Scan オペレーションは、結果で返される項目数を制限することができます。​これを行うには、フィルタ式を評価する前に、Limit パラメータに、Scan オペレーションが返す項目の最大数を設定します。

たとえば、フィルタ式を使用せず、Limit 値を 6 として、テーブルを Scan するとします。-Scan結果には、テーブルの最初の 6 つの項目が含まれます。

ここで、Scan にフィルタ式を追加するとします。この場合、DynamoDB は返される 6 つの項目にフィルタ式を適用し、一致しない項目を廃棄します。最終的な Scan 結果はフィルタリングされる項目の数に応じて、6 つ以下の項目を含みます。

ページ単位の出力件数を指定

DynamoDBページネートの結果をScanオペレーション. ページネーションでは、Scan結果は、サイズ 1 MB (以下) のデータの「ページ」に分割されます。アプリケーションは結果の最初のページ、次に 2 ページと処理できます。

1 つのデータScan1 MB のサイズ制限の範囲内の結果セットだけを返します。さらに結果があるかどうかを確認して、一度に 1 ページずつ結果を取り出すには、アプリケーションで次の操作を行う必要があります。

  1. 低レベルの Scan 結果を確認します。

    • 結果に LastEvaluatedKey 要素が含まれる場合、ステップ 2 に進みます。

    • ある場合ないaLastEvaluatedKey結果に「」と入力すると、これ以上取得する項目はありません。

  2. 以前のものと同じパラメータを使用して新しい Scan リクエストを作成します。ただし、今回は、ステップ 1 からの LastEvaluatedKey 値を取得して、新しい Scan リクエストの ExclusiveStartKey パラメータとして使用します。

  3. 新しい Scan リクエストを実行します。

  4. ステップ 1 に進んでください。

言い換えると、LastEvaluatedKey レスポンスからの Scan を、次の ExclusiveStartKey リクエストの Scan として使用する必要があります。LastEvaluatedKey レスポンスに Scan 要素がない場合、結果の最後のページを取得します。(結果セットの最後まで到達したことを確認できるのは、LastEvaluatedKey がないときだけです)

AWS CLI を使用してこの動作を表示できます。AWS CLI は、低レベルのScanリクエストを DynamoDB に対して繰り返し、LastEvaluatedKeyは結果に表示されなくなりました。全体をスキャンする次の AWS CLI の例を考えてみましょう。Moviesテーブルですが、特定のジャンルの映画のみを返します。

aws dynamodb scan \ --table-name Movies \ --projection-expression "title" \ --filter-expression 'contains(info.genres,:gen)' \ --expression-attribute-values '{":gen":{"S":"Sci-Fi"}}' \ --page-size 100 \ --debug

通常、AWS CLI はページ分割を自動的に処理します。ただし、この例では、AWS CLI--page-sizeパラメータは、ページごとの項目数を制限します。--debug パラメータは、リクエストとレスポンスについての低レベルの情報を表示します。

この例を実行した場合、DynamoDB からの最初のレスポンスは次のようになります。

2017-07-07 12:19:14,389 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":7,"Items":[{"title":{"S":"Monster on the Campus"}},{"title":{"S":"+1"}}, {"title":{"S":"100 Degrees Below Zero"}},{"title":{"S":"About Time"}},{"title":{"S":"After Earth"}}, {"title":{"S":"Age of Dinosaurs"}},{"title":{"S":"Cloudy with a Chance of Meatballs 2"}}], "LastEvaluatedKey":{"year":{"N":"2013"},"title":{"S":"Curse of Chucky"}},"ScannedCount":100}'

レスポンスの LastEvaluatedKey は、すべての項目が取得されたわけではないことを示します。AWS CLI は、別のScanリクエストを DynamoDB に送信します。このリクエストとレスポンスのパターンが、最終レスポンスまで繰り返されます。

2017-07-07 12:19:17,830 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":1,"Items":[{"title":{"S":"WarGames"}}],"ScannedCount":6}'

LastEvaluatedKey がない場合、これ以上取得する項目がないことを示します。

注記

AWS SDK は低レベルの DynamoDB レスポンス (LastEvaluatedKey)、ページネーションのための様々な抽象化を提供するScan結果。たとえば、SDK for Java ドキュメントインターフェイスは、java.util.Iteratorサポートを使用して、結果を一度に 1 つずつ確認できます。

さまざまなプログラミング言語のコード例については、Amazon DynamoDB 入門ガイドAWS SDK ドキュメントを参照してください。

結果での項目のカウント

Scan レスポンスには、条件に一致する項目に加えて次の要素が含まれます。

  • ScannedCount— 評価される項目の数です。ScanFilterが適用される。ScannedCount 値が大きく、Count 結果が小さいまたはない場合は、Scan オペレーションが不十分であることを示しています。リクエストでフィルタを使用していない場合、ScannedCountCount と同じです。

  • Count— 残っているアイテムの数。フィルタ式 (存在する場合) が適用されました。

注記

フィルタ式を使用しない場合、ScannedCountCount は同じ値を持ちます。

の大きさScan結果セットが 1 MB より大きい場合、ScannedCountおよびCount合計項目数の一部のカウントのみを表します。すべての結果を取得するためには、複数の Scan オペレーションを実行する必要があります (ページ単位の出力件数を指定 を参照してください)。

Scan レスポンスには、特定の ScannedCount によって処理された項目の Count および Scan が含まれます。すべての Scan リクエストの合計を取得するには、ScannedCount および Count の実行中の集計を維持することができます。

Scan で消費されるキャパシティーユニット

以下の操作を実行できます。Scan任意のテーブルまたはセカンダリインデックス。Scanオペレーションでは、読み込みキャパシティーユニットが消費されます。

...を Scan する場合 DynamoDB は... からの読み込みキャパシティーユニットを消費します。
テーブルのプロビジョニングされた読み込みキャパシティー。
グローバルセカンダリインデックス インデックスのプロビジョニングされた読み込みキャパシティー。
ローカルセカンダリインデックス ベーステーブルのプロビジョニングされた読み込みキャパシティー。

デフォルトでは、Scanオペレーションはどのくらいの読み込みキャパシティーを消費するかについてのデータを返しません。ただし、この情報を取得するために ReturnConsumedCapacity リクエストで Scanパラメータを指定できます。ReturnConsumedCapacity の有効な設定を以下に示します。

  • NONE— 消費されたキャパシティーデータは返されません。(これがデフォルトです)

  • TOTAL— レスポンスには消費された読み込みキャパシティーユニットの合計値が含まれます。

  • INDEXES— レスポンスは、アクセスする各テーブルとインデックスの消費されるキャパシティーとともに、消費される読み込みキャパシティーユニットの合計値を示します。

DynamoDB は、アプリケーションに返されるデータ量ではなく、項目のサイズに基づいて、消費される読み込みキャパシティーユニットの数を計算します。このため、消費されるキャパシティーユニットの数は、(射影式を使用して) 属性のすべてをリクエストしても (デフォルトの動作) 一部をリクエストしても、同じになります。数は、フィルタ式を使用していてもいなくても同じです。

スキャンの読み込み整合性

Scan オペレーションは、結果的に整合性のある読み込みをデフォルトで行います。つまり、Scan 結果が、最近完了した PutItem または UpdateItem オペレーションによる変更を反映しない場合があります。詳細については、「読み込み整合性」を参照してください。

強力な整合性のある読み込みが必要な場合は、Scan が開始する時に ConsistentRead パラメータを true リクエストで Scan に設定できます。これにより、Scan が開始する前に完了した書き込みオペレーションがすべて Scan 応答に含められます。

設定ConsistentReadtrueは、テーブルのバックアップまたはレプリケーションシナリオで役立ちます。DynamoDB Streams。最初に、テーブル内のデータの整合性のあるコピーを取得するため、ConsistentRead を true に設定して Scan を使用します。期間中ScanDynamoDB Streams は、テーブルで発生した追加の書き込みアクティビティをすべて記録します。Scan が完了したら、ストリームからテーブルへの書き込みアクティビティを適用できます。

注記

ConsistentReadtrue に設定した Scan オペレーションでは、ConsistentRead をデフォルト値 (false) のままにした場合と比較して、2 倍の読み込みキャパシティーユニットが使用されます。

並列スキャン

デフォルトでは、Scanオペレーションは、データを順次処理します。Amazon DynamoDB はアプリケーションに 1 MB ずつデータを返し、アプリケーションは追加のScanオペレーションでは、次の 1 MB のデータを取得できます。

スキャンするテーブルまたはインデックスが大きいほど、Scanを完了するのにかかります。さらに、シーケンシャルScanは、プロビジョニングされた読み込みスループットキャパシティーを常に完全に使用できるとは限りません。DynamoDB は、大きなテーブルのデータを複数の物理パーティションに分散しますが、Scanオペレーションで、一度に 1 つのパーティションのみを読み取ることができます。このため、スループットScan1 つのパーティションの最大スループットによって制限されます。

これらの問題に対処するために、Scanオペレーションは、テーブルまたはセカンダリインデックスを複数のセグメント、複数のアプリケーションワーカーがセグメントを並行してスキャンします。各ワーカーは、スレッド(マルチスレッドをサポートするプログラミング言語)またはオペレーティングシステムプロセスにすることができます。並列スキャンを実行するには、各ワーカーが独自のScanリクエストには次のパラメータが含まれます。

  • Segment— 特定のワーカーによってスキャンされるセグメント。各ワーカーは、Segment

  • TotalSegments— 並列スキャンのセグメントの合計数。この値は、アプリケーションが使用するワーカーの数と同じである必要があります。

次の図は、マルチスレッドアプリケーションがScan3度の並列性を持つ。

この図では、アプリケーションは 3 つのスレッドを生成し、各スレッドに番号を割り当てます。セグメントはゼロベースであるため、最初の数は常に 0 です。各スレッドはScan要求、設定Segmentをその指定された番号に設定し、TotalSegmentsを 3 に設定します。各スレッドは、指定されたセグメントをスキャンし、一度に 1 MB のデータを取得し、アプリケーションのメインスレッドにデータを返します。

の値SegmentおよびTotalSegments個々に適用するScanリクエストをオーバーライドし、いつでも異なる値を使用できます。アプリケーションが最高のパフォーマンスを達成するまで、これらの値および使用するワーカーの数を試す必要がある場合があります。

注記

多数のワーカーを使用した並列スキャンでは、スキャン対象のテーブルまたはインデックスに対してプロビジョニングされたスループットをすべて簡単に消費できます。テーブルまたはインデックスが他のアプリケーションから大量の読み取りまたは書き込みアクティビティが発生している場合は、このようなスキャンを避けることをお勧めします。

リクエストごとに返されるデータの量を制御するには、Limitパラメータ。これにより、1 人のワーカーがプロビジョニングされたスループットをすべて消費し、他のすべてのワーカーが犠牲になる状況を防ぐことができます。