DynamoDB는 대용량 데이터베이스에서 데이터를관리하고 검색하기 위한 강력한 NoSQL 데이터베이스이다.
이 글에서는 DynamoDB의 filterExpression
이 쓰이는 scan
과 query
작업 간의 차이점을 비교하고, filterExpression
동작 원리를 설명하려한다.
scan 과 query 작업:
DynamoDB의 scan
과 query
는 모두 데이터베이스에서 항목을 검색하는데 사용되는 주요 메서드이며 최대 1MB 데이터까지 검색할 수 있다.
테이블의 각 Item의 크기가 400kb라면, 한 번의 약 2개의 Item을 가져올 수 있다. 따라서 대용량 데이터를 처리할 때는 효율적인 pagination 및 필터링을 고려해야 한다.
- scan:
- 테이블의 전체 항목을 스캔하고 지정된 조건에 맞는 모든 item을 반환한다.
- 주로 특정 키 조건 없이 테이블의 모든 항목을 검색할 때 사용된다.
- 하지만 테이블 크기가 커질수록 비용과 성능 측면에서 매우 비효율적이다.
- query:
- 주 키나 또는 GSI(Global Secondary Index)를 사용하여 정확한 조건에 따라 item을 반환한다.
- 주로 특정 키를 기반으로 정확한 데이터를 조회하거나, 범위 쿼리를 수행할 때 사용된다.
- 효율적이면서 빠르기 때문에 비용 효율적인 방식으로 데이터를 가져올 수 있다.
FilterExpression 동작원리:
DynamoDB의 filterExpression
은 데이터베이스에서 데이터를 가져온 후에 필터를 적용하는 메커니즘이다.
이것은 RDS와는 달리 데이터를 가져오는 초기 단계에서 필터를 적용하지 않으며, 모든 데이터를 가져온 후에 필터를 적용하여 해당 Item을 반환한다. 이러한 동작원리는 DynamoDB에서 데이터를 검색하고 필터링할 때 주의해야할 점이다.
예를 들어, DynamoDB 테이블에 다음과 같은 항목이 있고 item의 크기가 각각 500KB 라고 가정해보자
// DynamoDB 테이블 항목
[
{ "ID": 1, "Status": "Active" },
{ "ID": 2, "Status": "Inactive" },
{ "ID": 3, "Status": "Active" }
]
이제 filterExpression을 사용하여 status가 Active인 항목을 검색하면
response = table.scan(
FilterExpression=Attr('Status').eq('Active')
)
보통 RDS와 같이 결과를 다음과 같이 예상할 것이다.
[
{ "ID": 1, "Status": "Active" },
{ "ID": 3, "Status": "Active" }
]
그러나 scan은 최대 1MB까지 가져오기 때문에 결과는 다음과 같이 나타난다.
// filterExpression을 적용하기 전 가져온 데이터
[
{ "ID": 1, "Status": "Active" },
{ "ID": 2, "Status": "Inactive" },
]
// scan 결과
[
{ "ID": 1, "Status": "Active" },
]
따라서 대용량으로 저장된 테이블에서 특정 기준으로 item을 검색하려고 한다면 LSI 또는 GSI를 이용하여 query를 사용하는 것이 효율적이다. 만약 검색 기준이 LSI 또는 GSI를 이용해서 하는 것이 안된다면 recursive하게 하도록 해야한다.
참고
'AWS' 카테고리의 다른 글
[AWS EC2] swap 메모리 설정 (0) | 2022.06.11 |
---|