LoginSignup
7
3

More than 5 years have passed since last update.

DynamoDBのクエリ機能

Posted at

DynamoDBに関する基本的な内容をまとめてみたものです。DynamoDBに関する、Web上にすでにある良識な解説コンテンツをまとめたサイトの抜粋です。
DynamoDBのクエリ機能

DynamoDBでのテーブル操作

DynamoDBでよく使われるテーブル操作のオペレーション(API)
- GetItem Hash keyを条件として指定して、一件の項目(item)を取得
- PutItem 1件の項目(item)を書き込み
- Update 1件の項目(item)を更新
- Delete 1件の項目(item)を削除
- Query Hash keyとRange keyの複合条件にマッチする項目(item)を取得
- BatchGet 複数のPrimary keyを指定して、マッチする項目(item)を取得
- Scan テーブルのすべての項目(item)および属性を取得

クエリのフィルタリング

DynamoDBでは、基本的に、Primary keyもしくはグローバルセカンダリーインデックスからのインデックスキーを使ってアイテムを取得しますが、Primary Keyではない属性でのクエリーフィルタリングもサポートします。

Query機能を呼び出す際に、QueryFilterを含むことができるのですが、 フィルターは、キーベースの取得の後、結果が返される前に適用されます。この方法でのフィルタリングを使うことにより、コードを簡単にし、効率化しつつ、アプリケーションに返されるデータの量を減らすことができます。

Query APIに渡すQueryFilterは1つ以上の条件を含む必要があります。 各条件は、属性名を参照し、比較演算子と一緒に1つ以上の属性値を含みます。通常のブール比較演算子に加えて、文字列マッチのために、CONTAINS、 NOT_CONTAINS、BEGINS_WITH を、範囲チェックのためにBETWEEN、セット内に存在するかを確認するために、INを使用することができます。

読み込み整合性

DynamoDBにおけるクエリ の結果は通常、「結果整合性のある読み込み「ですが、必要に応じて強力な整合性のある読み込みをリクエストすることもできます。結果整合性のある読み込みには、最近完了した PutItem または UpdateItem オペレーションの結果が反映されない可能性があります

またScan リクエストを発行すると、DynamoDB は結果的に整合性のある読み込みを使用します。つまり、テーブルでスキャンの実行直前に加えられたデータの変更は、スキャン結果に含まれない可能性があります。

データの整合性のあるコピーが必要な場合は、Scan が開始する時間に、ConsistentRead パラメーターを true に設定できます。これにより、Scan が開始する前に完了した書き込みオペレーションがすべて Scan 応答に含められます。これは、 DynamoDB Streams と同時に使用すると、テーブルのバックアップまたはレプリケーションシナリオで役立ちます。

クエリおよびスキャンのパフォーマンス

Scan オペレーションでは常にテーブル全体またはsecondary indexがスキャンされ、目的の結果を得るために値にフィルタが適用され、基本的に結果セットからデータを削除するステップが追加されます。フィルタによって多数の結果が除外されるようなサイズの大きいテーブルまたはインデックスでは、可能な限り Scan オペレーションを使用しないことをお勧めします。

また、テーブルやインデックスが大きくなるに従って、Scan オペレーションは低速になります。Scan オペレーションでは、リクエストした値に対するすべての項目が調べられるため、サイズの大きいテーブルまたはインデックスでは、プロビジョニングされたスループットが 1 回のオペレーションで枯渇する可能性があります。高速な応答時間を得るには、アプリケーションが Scan ではなく Query を使用できるようにテーブルとインデックスを設計します。

並列スキャン

デフォルトでは、Scan オペレーションはデータを連続的に処理します。DynamoDB は 1 MB の増分でアプリケーションにデータを返し、アプリケーションは追加の Scan オペレーションを実行して、次の 1 MB 分のデータを取り出します。

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

これらの問題に対処するために、Scan オペレーションではテーブルまたはsecondary indexを複数のセグメントに論理的に分割して、複数のアプリケーションワーカーがセグメントに対する並列スキャンを行うことができます。並列スキャンを実行するには、それぞれのセグメントに対する Scan リクエスト実行を指示します。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3