dynamodb에서 스캔과 쿼리의 차이점은 무엇입니까? 스캔 / 쿼리를 사용할 때?


84

DynamoDb 설명서에 지정된 쿼리 작업 :

쿼리 작업은 기본 키 속성 값만 검색하고 키 속성 값에 대한 비교 연산자의 하위 집합을 지원하여 검색 프로세스를 구체화합니다.

및 스캔 작업 :

스캔 작업은 전체 테이블을 스캔합니다. 전체 스캔 후 반환되는 값을 구체화하기 위해 결과에 적용 할 필터를 지정할 수 있습니다.

성능 및 비용 고려 사항을 기반으로하는 것이 가장 좋습니다.

답변:


52

Dynamodb 테이블을 생성 할 때 쿼리 작업이 원하는 항목을 반환하도록 기본 키 및 로컬 보조 인덱스 (LSI)를 선택합니다.

쿼리 작업은 기본 키의 동일한 연산자 평가 만 지원하지만 정렬 키에서는 조건부 (=, <, <=,>,> =, Between, Begin)를 지원합니다.

요청하는 항목을 가져 오기 위해 작업이 테이블의 각 항목을 반복해야하므로 스캔 작업은 일반적으로 더 느리고 비용이 많이 듭니다.

예:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

이 예에서는 쿼리 작업을 사용하여 다음을 가져올 수 있습니다.

  1. AccountType에 대한 조건부 필터가있는 CustomerId

다음을 반환하려면 Scan 작업을 사용해야합니다.

  1. 특정 계정 유형을 가진 모든 고객
  2. 국가 별 조건부 필터 기반 항목 (예 : 미국의 모든 고객)
  3. LastPurchase의 조건부 필터를 기반으로하는 항목 (예 : 지난달에 구매 한 모든 고객)

LSI (Local Secondary Index) 또는 GSI (Global Secondary Index)를 생성하는 자주 사용되는 작업에 대한 스캔 작업을 방지합니다.

예:

Table: CustomerId, AccountType, Country, LastPurchase

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

이 예에서 쿼리 작업을 통해 다음을 얻을 수 있습니다.

  1. AccountType에 대한 조건부 필터가있는 CustomerId
  2. [GSI] 특정 AccountType의 CustomerId에 대한 조건부 필터
  3. [LSI] LastPurchase에 조건부 필터가있는 CustomerId

1
기본 키 : CustomerId + AccountType (CustomerID가 파티션 키이고 AccountType이 정렬 키인 것을 알고 있습니다) 인 경우 CustomerID 또는 CustomerID + AccountType으로 만 쿼리 작업을 실행할 수 있다고 생각합니다. 당신이 ACCOUNTTYPE으로 검색하는 경우에만이 검사 될 것이다
아딜

1
감사합니다 @Adil. 당신이 맞습니다, 나는 이것을 반영하기 위해 내 대답을 편집했습니다.
Kinman


34

dynamodb 테이블 파티션 키 / 기본 키가 customer_country. 쿼리를 사용하는 경우 customer_country쿼리 작업을 수행하기위한 필수 필드입니다. 모든 필터는 다음에 속한 항목 만 만들 수 있습니다.customer_country .

테이블 스캔을 수행하면 모든 파티션 키 / 기본 키에 대해 필터가 수행됩니다. 먼저 모든 데이터를 가져와 테이블에서 가져온 후 필터를 적용합니다.

예 :

여기 customer_country파티션 키 / 기본 키 가 있습니다.id 는 IS sort_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를 초과하는 스캔 작업을 수행하지 마십시오.


답변의 출처를 말씀해 주시겠습니까?
AlikElzin-kilaka


10

쿼리는 스캔보다 훨씬 낫습니다. 이름에서 알 수 있듯이 scan은 전체 테이블을 스캔합니다. 그러나 Query를 사용할 수 있다는 것을 알기 위해서는 테이블 키, 정렬 키, 인덱스 및 관련 정렬 인덱스를 잘 알고 있어야합니다. 다음을 사용하여 쿼리를 필터링하는 경우 :

  • 키 및 키 정렬
  • 인덱스
  • 색인 및 관련 정렬 키

쿼리를 사용하십시오! 그렇지 않으면 필터링 할 수있는 열에 대해 더 유연한 스캔을 사용하십시오.

다음과 같은 경우 쿼리 할 수 ​​없습니다.

  • 필터에서 2 개 이상의 필드 (예 : 키, 정렬 및 색인)
  • 정렬 키만 (기본 키 또는 인덱스)
  • 일반 필드 (키, 색인 또는 정렬 아님)
  • 혼합 인덱스 및 정렬 (인덱스 1과 인덱스 2의 정렬) \
  • ...

좋은 설명 : https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f


9

성능 측면에서 .NET Query대신 응용 프로그램을 사용할 수 있도록 테이블을 디자인하는 것이 좋습니다 Scan. 스캔 작업은 원하는 값을 필터링하기 전에 항상 전체 테이블을 스캔하기 때문에 읽기, 쓰기 및 삭제와 같은 데이터 작업을 처리하는 데 더 많은 시간과 공간이 필요합니다. 자세한 내용 은 공식 문서 를 참조하세요.


7

관계형 데이터베이스와 유사합니다.

조건 query에서 기본 키를 사용하고 있는지 확인 하십시오 where. 계산 복잡성은log(n) 대부분의 키 구조가 이진 트리이기 때문입니다.

scan쿼리 하는 동안 전체 테이블을 스캔 한 다음 모든 단일 필터를 적용 row하여 올바른 결과를 찾아야합니다. 성능은 O(n)입니다. 테이블이 크면 훨씬 느립니다.

요컨대, get기본 키를 알고 있으면 사용해보십시오 . 단지 scan에만 최악의 경우에.

또한 성능 목표를 얻기 위해 서로 다른 키에 대해 서로 다른 종류의 쿼리를 지원하는 글로벌 보조 인덱스에 대해 생각해보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.