DynamoDB でのスキャンの使用 - Amazon DynamoDBから重要そうな部分を拾い読みします。
取得できるのは最大1MBまで
1 回の Scan リクエストで、最大 1 MB のデータを取得できます。DynamoDB では、必要に応じてこのデータにフィルタ式を適用して、結果をユーザーに返す前に絞り込むことができます。
1MB制限はフィルタリング前の取得データに適用される。
フィルタ式は、Scan の完了後、結果が返される前に適用されます。そのため、Scan は、フィルタ式があるかどうかにかかわらず、同じ量の読み込みキャパシティーを消費します。
1 回の Scan オペレーションで、最大 1 MB のデータを取得できます。この制限は、フィルタ式を評価する前に適用されます。
例えば、全体で2MBのDynamoDBが存在するとします。
特定の属性でフィルターをかけて、必要なデータだけを取得したいです。
特定属性のデータは全部で1MB以下です。
この時、フィルタ付きScanリクエストですべての特定属性のデータを取得できない可能性があります。
1回目のScanリクエストでDynamoの全体から1MBのデータを取得します。
取得したデータから特定属性のデータのみを抽出します。
この時、後半の1MBはフィルタリングの母集団に含まれないので、それらを取得することができません。
DynamoDB全体から特定属性のデータを取得したいのであれば、2回Scanリクエストを投げる必要があるのです。
結果セットの項目数制限
ScanリクエストはLimitパラメータで取得項目数に制限をかけることができます。
10とすれば10個の項目を取得できます。
これはフィルタリングの動作とは異なり、全項目を取得してそこから先頭10件をフィルタリングするわけではありません。
最初から10個の項目しか取得しません。
したがって、最低限のキャパシティしか消費しません。
Limitとフィルタリングを併用した場合は、フィルタリング対象の母集団はLimitで制限して取得した項目になります。
つまり、Limit=10とフィルタリングを行った場合、フィルタリング対象の母集団は、取得した10件の項目となります。
一回のリクエストで取得しきれなかった場合は、LastEvaluatedKeyを用いて再リクエストする
具体的な実装方法は以下の記事を参照してください。
DynamoDBをパーティション分割して、並列スキャンを行うことも可能。
そうすることで、シーケンシャルScanよりも早くデータを取得することができます。