web-dev-qa-db-ja.com

dynamodbのスキャンとクエリの違いは何ですか?スキャン/クエリを使用する場合

DynamoDbドキュメントで指定されているクエリ操作:

クエリ操作では、主キー属性値のみを検索し、キー属性値の比較演算子のサブセットをサポートして、検索プロセスを絞り込みます。

スキャン操作:

スキャン操作は、テーブル全体をスキャンします。スキャン完了後に、結果に適用するフィルターを指定して、返される値を絞り込むことができます。

パフォーマンスとコストの考慮事項に基づいて最適です。

45
samson

customer_countryとしてdynamodbテーブルパーティションキー/プライマリキーがあります。クエリを使用する場合、customer_countryはクエリ操作を行うための必須フィールドです。すべてのフィルターは、customer_countryに属するアイテムのみに作成できます。

テーブルスキャンを実行すると、すべてのパーティションキー/プライマリキーでフィルターが実行されます。まず、すべてのデータをフェッチし、テーブルからフェッチした後にフィルターを適用します。

例:=

ここでcustomer_countryパーティションキー/主キーであり、idsort_keyです

-----------------------------------

customer_country | name   | id

-----------------------------------
VV               | Tom    | 1

VV               | Jack   | 2

VV               | Mary   | 4

BB               | Nancy  | 5

BB               | Lom    | 6

BB               | XX     | 7

CC               | YY     | 8

CC               | ZZ     | 9

------------------------------------
  • クエリ操作を実行する場合、customer_country値にのみ適用されます。値は等号演算子(=)のみにする必要があります。

  • そのため、そのパーティションキー/プライマリキー値に等しいアイテムのみがフェッチされます。

  • スキャン操作を実行すると、そのテーブル内のすべてのアイテムを取得し、そのデータを取得した後にデータを除外します。

注: RCUを超えるスキャン操作を実行しないでください。

30
OK200

Dynamodbテーブルを作成する場合、クエリ操作で必要な項目が返されるように、プライマリキーとローカルセカンダリインデックス(LSI)を選択します。

クエリ操作では、プライマリキーの等価演算子評価のみがサポートされますが、ソートキーでは条件(=、<、<=、>、> =、Between、Begin)が評価されます。

スキャン操作は、要求しているアイテムを取得するためにテーブル内の各アイテムを反復処理する必要があるため、一般に低速でコストがかかります。

例:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

この例では、クエリ操作を使用して以下を取得できます。

  1. AccountTypeの条件フィルターを使用したCustomerId

以下を返すには、スキャン操作を使用する必要があります。

  1. 特定のAccountTypeを持つすべての顧客
  2. 国別の条件フィルターに基づくアイテム、つまり米国のすべての顧客
  3. LastPurchaseによる条件フィルターに基づいたアイテム、つまり、先月に購入したすべての顧客

ローカルセカンダリインデックス(LSI)またはグローバルセカンダリインデックス(GSI)を作成する頻繁に使用される操作でのスキャン操作を回避するため。

例:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase

この例では、クエリ操作で次のものを取得できます。

  1. AccountTypeの条件フィルターを使用したCustomerId
  2. [GSI]特定のAccountTypeのCustomerIdsの条件フィルター
  3. [LSI] LastPurchaseの条件フィルターを使用したCustomerId
27
Kinman

パフォーマンスの観点から、アプリケーションがQueryの代わりにScanを使用するようにテーブルを設計することをお勧めします。スキャン操作は、必要な値を除外する前に常にテーブル全体をスキャンするため、読み取り、書き込み、削除などのデータ操作を処理するためにより多くの時間とスペースが必要になることを意味します。詳細については、 公式ドキュメント を参照してください。

6
Liutong Chen

クエリはスキャンよりもはるかに優れています-パフォーマンスの点で。 scanは、その名前が示すとおり、テーブル全体をスキャンします。ただし、クエリを使用できることを知るには、テーブルキー、ソートキー、インデックス、および関連するソートインデックスを十分に理解する必要があります。次を使用してクエリをフィルタリングする場合:

  • キー
  • キーとキーの並べ替え
  • インデックス
  • インデックスとそれに関連するソートキー

クエリを使用してください!それ以外の場合は、フィルタリングできる列についてより柔軟なスキャンを使用します。

次の場合はクエリできません。

  • フィルター内の2つ以上のフィールド(キー、ソート、インデックスなど)
  • (主キーまたはインデックスの)ソートキーのみ
  • 通常のフィールド(キー、インデックス、並べ替えではない)
  • インデックスとソートの混合(index1とindex2のソート)\
  • ...

良い説明: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f

3
Open Voip

リレーショナルデータベースと同様です。

query条件で主キーを使用しているwhereを取得します。キー構造のほとんどが二分木であるため、計算の複雑さはlog(n)です。

scanクエリでは、テーブル全体をスキャンしてから、すべてのrowにフィルターを適用して正しい結果を見つける必要があります。パフォーマンスはO(n)です。テーブルが大きい場合ははるかに遅くなります。

つまり、主キーがわかっている場合は、getを使用してみてください。最悪の場合のみscanのみ。

また、パフォーマンスの目標を達成するために、異なるキーで異なる種類のクエリをサポートするグローバルセカンダリインデックスについて考えます

0
Joey Trang