Django/orm

Dynamdb() Scan vs query

두잇 두두 2024. 2. 6. 18:09
728x90

https://pypy.dev/serverless/dynamodb-scan-vs-query/

 

DynamoDB Scan vs Query

TL;DR 개요 Scan vs Query Scan Query 어떨 때 Scan 을 쓰고 어떨 때 Query 를 쓰나요? 검색하고자 하는 값이 한개인 경우 검색하고자 하는 값이 여러개인 경우 (번외) index 로컬 보조 인덱스(LSI) 글로벌 보조

pypy.dev

앞서 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 현재 스캔하는 세그먼트의 인덱스를 나타냅니다.