DynamoDb 설명서에 지정된 쿼리 작업 :
쿼리 작업은 기본 키 속성 값만 검색하고 키 속성 값에 대한 비교 연산자의 하위 집합을 지원하여 검색 프로세스를 구체화합니다.
및 스캔 작업 :
스캔 작업은 전체 테이블을 스캔합니다. 전체 스캔 후 반환되는 값을 구체화하기 위해 결과에 적용 할 필터를 지정할 수 있습니다.
성능 및 비용 고려 사항을 기반으로하는 것이 가장 좋습니다.
답변
Dynamodb 테이블을 생성 할 때 쿼리 작업이 원하는 항목을 반환하도록 기본 키 및 로컬 보조 인덱스 (LSI)를 선택합니다.
쿼리 작업은 기본 키의 동일한 연산자 평가 만 지원하지만 정렬 키에서는 조건부 (=, <, <=,>,> =, Between, Begin)를 지원합니다.
요청하는 항목을 가져 오기 위해 작업이 테이블의 각 항목을 반복해야하므로 스캔 작업은 일반적으로 더 느리고 비용이 많이 듭니다.
예:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
이 예에서는 쿼리 작업을 사용하여 다음을 가져올 수 있습니다.
- AccountType에 대한 조건부 필터가있는 CustomerId
다음을 반환하려면 Scan 작업을 사용해야합니다.
- 특정 계정 유형을 가진 모든 고객
- 국가 별 조건부 필터 기반 항목 (예 : 미국의 모든 고객)
- LastPurchase의 조건부 필터를 기반으로하는 항목 (예 : 지난달에 구매 한 모든 고객)
LSI (Local Secondary Index) 또는 GSI (Global Secondary Index)를 생성하는 자주 사용되는 작업에 대한 스캔 작업을 방지합니다.
예:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
이 예에서 쿼리 작업을 통해 다음을 얻을 수 있습니다.
- AccountType에 대한 조건부 필터가있는 CustomerId
- [GSI] 특정 AccountType의 CustomerId에 대한 조건부 필터
- [LSI] LastPurchase에 조건부 필터가있는 CustomerId
답변
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를 초과하는 스캔 작업을 수행하지 마십시오.
답변
쿼리는 스캔보다 훨씬 낫습니다. 이름에서 알 수 있듯이 scan은 전체 테이블을 스캔합니다. 그러나 Query를 사용할 수 있다는 것을 알기 위해서는 테이블 키, 정렬 키, 인덱스 및 관련 정렬 인덱스를 잘 알고 있어야합니다. 다음을 사용하여 쿼리를 필터링하는 경우 :
- 키
- 키 및 키 정렬
- 인덱스
- 색인 및 관련 정렬 키
쿼리를 사용하십시오! 그렇지 않으면 필터링 할 수있는 열에 대해 더 유연한 스캔을 사용하십시오.
다음과 같은 경우 쿼리 할 수 없습니다.
- 필터에서 2 개 이상의 필드 (예 : 키, 정렬 및 색인)
- 정렬 키만 (기본 키 또는 인덱스)
- 일반 필드 (키, 색인 또는 정렬 아님)
- 혼합 인덱스 및 정렬 (인덱스 1과 인덱스 2의 정렬) \
- …
답변
성능 측면에서 .NET Query
대신 응용 프로그램을 사용할 수 있도록 테이블을 디자인하는 것이 좋습니다 Scan
. 스캔 작업은 원하는 값을 필터링하기 전에 항상 전체 테이블을 스캔하기 때문에 읽기, 쓰기 및 삭제와 같은 데이터 작업을 처리하는 데 더 많은 시간과 공간이 필요합니다. 자세한 내용 은 공식 문서 를 참조하세요.
답변
관계형 데이터베이스와 유사합니다.
조건 query
에서 기본 키를 사용하고 있는지 확인 하십시오 where
. 계산 복잡성은log(n)
대부분의 키 구조가 이진 트리이기 때문입니다.
scan
쿼리 하는 동안 전체 테이블을 스캔 한 다음 모든 단일 필터를 적용 row
하여 올바른 결과를 찾아야합니다. 성능은 O(n)
입니다. 테이블이 크면 훨씬 느립니다.
요컨대, get
기본 키를 알고 있으면 사용해보십시오 . 단지 scan
에만 최악의 경우에.
또한 성능 목표를 얻기 위해 서로 다른 키에 대해 서로 다른 종류의 쿼리를 지원하는 글로벌 보조 인덱스에 대해 생각해보십시오.
답변
