Home
Database
카산드라 IN 조건 쿼리 (Cassandra IN clause query)
devfoxstar
devfoxstar
December 29, 2022
1 min

Table Of Contents

01
IN clause
02
그럼 NoSQL인 카산드라는 어떨까요?
03
그럼 IN 조건의 대안은 뭘까요?

IN clause

쿼리 작업을 하다 보면, 어쩔 수 없이 IN 조건을 써야 하는 경우가 있습니다.
사실 IN 조건만큼 간편한 기능도 없습니다.

SELECT * FROM test WHERE test_id IN (1, 2, 3);

그런데 IN 조건은 성능이 좋지 않은 대표적인 Anti-Pattern입니다.
IN 조건이 활용된 대부분의 쿼리에서 Full Scan이 발생하기 때문입니다.

비교적 IN 조건을 자주 활용하는 RDB에서 조차 데이터가 많아지면 급격한 성능 저하가 발생합니다.
Optimizer가 처음에는 Index Scan을 활용하지만, 일정 수준이 넘어가면 바로 Full Scan을 시작하기 때문입니다.


그럼 NoSQL인 카산드라는 어떨까요?

초기 버전에서는 IN 조건을 지원하지 않았습니다.
이후 버전이 업데이트 되면서 IN 조건을 지원했지만, 여전히 권장하지는 않습니다.

카산드라에서 IN 조건을 쓰기 위해서는 추가 조건이 필요합니다.

SELECT * FROM test WHERE test_id IN (1, 2, 3) ALLOW FILTERING;

그런데 ALLOW FILTERING은 카산드라의 핵심인 데이터 분산 조회를 무효화 하는 역할을 합니다.
카산드라는 Partition Key를 기준으로 각각의 Node에 데이터를 분산하는 Cluster 구조입니다.

하지만 ALLOW FILTERING 조건이 들어가면, 분산 데이터를 조회하지 않습니다.
전체 Cluster를 대상으로 필터링이 이뤄집니다.

심지어 AWS에서 제공하는 Amazon Keyspaces에서는 IN 조건을 지원하지 않습니다.
참고로 Amazon Keyspaces는 AWS 전용 카산드라 호환 데이터베이스 서비스입니다.

Amazon Keyspaces에서 IN 조건을 지원하지 않는 이유는 바로 성능 때문입니다.
이외에도 카산드라의 일부 기능들을 성능을 비롯한 여러 이유로 지원하지 않습니다.

아래 페이지에서 자세한 내용을 확인할 수 있습니다.
기능상의 차이 : 아마존 키스페이스와 아파치 카산드라


그럼 IN 조건의 대안은 뭘까요?

공식적으로 정해진 방법은 없습니다.
하지만 DataStax, Stack Overflow 등에서는 몇 가지 방법을 권장하고 있습니다.

먼저 데이터 모델링입니다.
애초에 IN 조건이 필요 없는 데이터 구조를 만들면 됩니다.

하지만 수시로 바뀌는 비지니스 로직을 맞추려면 불가피하게 IN 조건이 필요할 수도 있습니다.

이때는 병렬 처리를 권장합니다.
Parallel query를 활용해서 개별 데이터를 가져온 후에, 어플리케이션에서 조합하는 방식입니다.

실제로 IN 조건을 활용하는 통합 조회보다, 개별 조회가 더 좋은 성능을 보입니다.
카산드라는 개별 데이터의 빠른 조회를 지원하는 분산 구조이기 때문에 가능한 방식입니다.

List list = ResultSets.queryAll(session,
    "SELECT * FROM test WHERE test_id = ?",
    1,
    2
);
 
for (ResultSet rs : list.get) {
    //Process the result set
}

Tags

#Database#DB#Cassandra#IN

Related Posts

Redis CLI, GUI (REDISINSIGHT)
March 11, 2023
1 min
© 2024, All Rights Reserved.

Quick Links

About Me

Media