DynamoDB-スキャン

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

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

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

スキャン操作の種類

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

Note − 1MBの制限は、フィルタリングを適用する前に適用されます。

Throughput Specifications−スキャンはスループットを消費しますが、消費は返されたデータではなくアイテムのサイズに焦点を合わせます。すべての属性を要求する場合でも、少数の属性を要求する場合でも、消費量は同じままであり、フィルター式を使用するかどうかも消費量に影響しません。

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

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

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

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

Consistency−クエリ結果とスキャン結果は結果整合性のある読み取りですが、強い整合性のある読み取りを設定することもできます。使用ConsistentRead この設定を変更するパラメータ。

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

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

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

パラレルスキャン

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

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

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

労働者番号

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

Note−大量のワーカーを使用した並列スキャンは、すべてのスループットを消費する可能性があるため、スループットに影響を与えます。この問題は、1人のワーカーがすべてのスループットを消費するのを防ぐために使用できるLimitパラメーターを使用して管理します。

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

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

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

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()); 
      }     
   } 
}