728x90
https://pypy.dev/serverless/dynamodb-scan-vs-query/
앞서 query를 사용해서를 구현했었는데 query에 filter을 걸 일이 있어서 기능을 찾아보던 도중 Scan을 통해 구현했었는데
Scan과 query의 차이점이 궁금해서 찾아봤습니다
위의 블로그에서 정리를 잘해둬서 가져왔습니다
3줄 요약
scan은 전체를 읽어오기 때문에 가능하면 query로
query는 pk, 해시, 보조키를 바탕으로 선택한 파티션을 직접 조회합니다
검색하고자 하는 아이템의 index를 아는가? query, 모르는가? scan
코드
from boto3.dynamodb.conditions import Key, Attr
원하는 기능은 table에서 해당 키 값이 존재하지 않으면서(True,False 등으로 대체 가능) pk 값이 eq('원하는 값')을 찾고자 해서 FilterExpression을 사용해 구현하고자 했다
response = dynamodb_client.table.scan(
FilterExpression=Attr('키 값').not_exists() &
Attr('pk').eq('매치 해야할 값')
)
처음 아무것도 모르고 scan을 써서 구현했던 로직이다
그 뒤 scan과 query의 차이점을 알고
query_result = dynamodb_client.table.query(
KeyConditionExpression=Key('pk').eq('원하는 값'),
FilterExpression=Attr('매치해야 하는 값').not_exists()
)
query로 수정하였다
query 파라미터
response = dynamodb_client.table.query(
KeyConditionExpression='partition_key = :partition_value',
ProjectionExpression='attribute1, attribute2', # Optional, 선택적
FilterExpression='attribute3 = :attribute_value', # Optional, 선택적
ExpressionAttributeValues={':partition_value': 'desired_value', ':attribute_value': 'desired_value'}, # Optional, 선택적
Limit=10, # Optional, 선택적
ScanIndexForward=True # Optional, 선택적
)
- KeyConditionExpression: (Necessity)
* 쿼리의 기본 키 조건을 지정합니다. 주로 파티션 키를 기반으로 쿼리할 때 사용됩니다. - ProjectionExpression: (Option)
* 조회 결과에 포함할 속성을 지정합니다. 필요한 속성만 선택하여 데이터를 더 효율적으로 가져올 수 있습니다. - FilterExpression: (Option)
* 쿼리 결과를 필터링하기 위한 추가 조건을 지정합니다. 필터링은 기본 키 조건에 추가적으로 적용됩니다. - ExpressionAttributeValues: (Option)
* 표현식에서 사용되는 값들에 대한 맵을 지정합니다. 값들은 쿼리나 필터 표현식에서 변수처럼 사용됩니다. - Limit: (Option)
* 쿼리 결과로 반환되는 항목 수를 제한합니다. 필요에 따라 사용됩니다. - ScanIndexForward: (Option)
* 기본값은 True이며, False로 설정하면 역순으로 정렬된 결과를 받을 수 있습니다.
Scan 파라미터
response = dynamodb_client.table.scan(
ProjectionExpression='attribute1, attribute2', # Optional, 선택적
FilterExpression='attribute3 = :attribute_value', # Optional, 선택적
ExpressionAttributeValues={':attribute_value': 'desired_value'}, # Optional, 선택적
Limit=10, # Optional, 선택적
Segment=0, # Optional, 선택적
TotalSegments=1 # Optional, 선택적
)
- Segment 및 TotalSegments: Option
- 선택적 항목.
- 병렬 스캔을 수행할 때 사용됩니다. TotalSegments는 전체 스캔을 몇 개의 세그먼트로 나눌지를 지정하고, Segment는 현재 스캔하는 세그먼트의 인덱스를 나타냅니다.
'Django > orm' 카테고리의 다른 글
count() 관련 성능 비교 (0) | 2024.07.22 |
---|---|
update_or_create (0) | 2024.06.28 |
DynamoDB() (0) | 2024.02.05 |
Django date range (0) | 2024.02.01 |
F() (0) | 2024.01.24 |