Dynamodb-scan

提供:Dev Guides
移動先:案内検索

DynamoDB-スキャン

スキャン操作は、すべてのテーブル項目またはセカンダリインデックスを読み取ります。 そのデフォルト関数は、インデックスまたはテーブル内のすべてのアイテムのすべてのデータ属性を返します。 属性のフィルタリングに ProjectionExpression パラメーターを使用します。

一致が見つからない場合でも、すべてのスキャンは結果セットを返し、結果として空のセットになります。 スキャンは、データをフィルタリングするオプションを使用して、1MB以下を取得します。

_ -スキャンのパラメーターとフィルタリングはクエリにも適用されます。

スキャン操作の種類

フィルタリング-スキャン操作は、スキャンまたはクエリ後にデータを変更するフィルター式を使用して、細かいフィルタリングを提供します。結果を返す前。 式は比較演算子を使用します。 それらの構文は、フィルター式では許可されないキー属性を除き、条件式に似ています。 フィルター式でパーティションまたはソートキーを使用することはできません。

_ -フィルタリングを適用する前に1MBの制限が適用されます。_

スループット仕様-スキャンはスループットを消費しますが、消費は返されるデータではなくアイテムのサイズに集中します。 すべての属性を要求しても数個の属性を要求しても消費は同じままであり、フィルター式を使用しても使用しなくても消費には影響しません。

ページネーション-DynamoDBは結果をページ分割し、結果を特定のページに分割します。 返される結果には1MBの制限が適用され、それを超えると、残りのデータを収集するために別のスキャンが必要になります。 LastEvaluatedKey 値を使用すると、この後続のスキャンを実行できます。 値を ExclusiveStartkey に適用するだけです。 LastEvaluatedKey 値がnullになると、操作はデータのすべてのページを完了しました。 ただし、null以外の値は、自動的により多くのデータが残ることを意味しません。 ヌル値のみがステータスを示します。

制限パラメータ-制限パラメータは結果のサイズを管理します。 DynamoDBはこれを使用して、データを返す前に処理するアイテムの数を確立し、スコープ外では機能しません。 xの値を設定すると、DynamoDBは一致する最初のxアイテムを返します。

LastEvaluatedKey値は、部分的な結果をもたらす制限パラメーターの場合にも適用されます。 スキャンを完了するために使用します。

結果カウント-クエリおよびスキャンへの応答には、スキャン/クエリされたアイテムを定量化し、返されたアイテムを定量化する ScannedCount およびCountに関連する情報も含まれます。 フィルタリングしない場合、値は同じです。 1MBを超えると、カウントは処理された部分のみを表します。

一貫性-クエリ結果とスキャン結果は最終的に一貫した読み取りになりますが、強く一貫した読み取りを設定することもできます。 この設定を変更するには、 ConsistentRead パラメーターを使用します。

_ -一貫性のある読み取り設定は、強く一貫性が設定されている場合、2倍の容量単位を使用することで消費に影響します。

パフォーマンス-クエリは、テーブル全体またはセカンダリインデックスをクロールするため、スキャンよりもパフォーマンスが向上し、応答が遅くなり、スループットが大量に消費されます。 スキャンは小さなテーブルと少ないフィルターでの検索に最適ですが、突然の高速な読み取りアクティビティの回避や並列スキャンの活用などのいくつかのベストプラクティスに従うことで、無駄のないスキャンを設計できます。

クエリは、特定の条件を満たすキーの特定の範囲を検出します。パフォーマンスは、キーの量ではなく、取得するデータの量によって決まります。 操作のパラメーターと一致の数は、特にパフォーマンスに影響します。

並列スキャン

スキャン操作は、デフォルトで順次処理を実行します。 次に、データを1MBずつ返します。これにより、アプリケーションは次の部分をフェッチするように求められます。 これにより、大きなテーブルとインデックスを長時間スキャンします。

この特性は、スキャンが常に利用可能なスループットを十分に活用するとは限らないことも意味します。 DynamoDBは、テーブルデータを複数のパーティションに分散します。スキャンスループットは、単一パーティション操作のため、単一パーティションに制限されたままです。

この問題の解決策は、テーブルまたはインデックスを論理的にセグメントに分割することです。 次に、「ワーカー」がセグメントを並行して(同時に)スキャンします。 Segmentおよび TotalSegments のパラメーターを使用して、特定のワーカーによってスキャンされるセグメントを指定し、処理されるセグメントの合計量を指定します。

労働者番号

最高のアプリケーションパフォーマンスを実現するには、ワーカー値(Segmentパラメーター)を試す必要があります。

-大量のワーカーセットを使用した並列スキャンは、すべてのスループットを消費する可能性があるため、スループットに影響します。 この問題は、単一のワーカーがすべてのスループットを消費しないようにするために使用できるLimitパラメーターで管理します。

以下はディープスキャンの例です。

-次のプログラムは、以前に作成されたデータソースを想定している場合があります。 実行を試みる前に、サポートライブラリを取得し、必要なデータソース(必要な特性を備えたテーブル、または他の参照ソース)を作成します。

この例では、Eclipse IDE、AWS認証情報ファイル、およびEclipse AWS Javaプロジェクト内のAWS Toolkitも使用します。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.ScanOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;

public class ScanOpSample {
   static DynamoDB dynamoDB = new DynamoDB(
      new AmazonDynamoDBClient(new ProfileCredentialsProvider()));
   static String tableName = "ProductList";

   public static void main(String[] args) throws Exception {
      findProductsUnderOneHun();                      //finds products under 100 dollars
   }
   private static void findProductsUnderOneHun() {
      Table table = dynamoDB.getTable(tableName);
      Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();
      expressionAttributeValues.put(":pr", 100);

      ItemCollection<ScanOutcome> items = table.scan (
         "Price < :pr",                                 //FilterExpression
         "ID, Nomenclature, ProductCategory, Price",    //ProjectionExpression
         null,                                          //No ExpressionAttributeNames
         expressionAttributeValues);

      System.out.println("Scanned " + tableName + " to find items under $100.");
      Iterator<Item> iterator = items.iterator();

      while (iterator.hasNext()) {
         System.out.println(iterator.next().toJSONPretty());
      }
   }
}