BBH
-Biz Branding Hub-
投稿日 : 
2019/12/05
更新日 : 
2019/12/05

【DynamoDB】把握しておいた方がいいScanの仕様

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よりも早くデータを取得することができます。

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend