Database/Cassandra

[Cassandra] select 쿼리 작성시 참고사항

bisi 2020. 5. 14. 10:54

Cassandra 디자인 하면서 데이터를 가져오는 Select 쿼리 실행시 참고하면 좋을 내용을 정리해보았다. 

 

 

1. 대소문자 구분 안함

카산드라는 대소문자를 구문 안하므로, CamelCase와 같은 문자 표기법을 사용할 수 없다. 

대문자로 입력해도 무조건 소문자로 저장한다.

대문자를 사용하고 싶다면 큰따옴표를 사용하면 강제로 실행할수 있다.

[공식 다큐먼트]

 

 

 

2. 복합키 사용 (Compund Primary key)

 

카산드라에서는 Primary key가 Partition key와 Clustering key로 구분된다. 

이는 테이블 생성시 Primary key 항목에 , 로 구분하여 입력하면된다. 

 

기억해야할 점은 Partition key는 필수적으로 지정해줘야하고, 복수개 설정이 가능하다.

Clustering key는 지정해주지 않아도 되며, 복수개로 설정이 가능하다. 

 

아래는 예시를 살펴보자.

 

C1 : Partition Key가 C1 이고, Clustering key가 없는 경우

 

(C1, C2) : Partition Key가 C1 이고, Clustering key가 C2인 경우

 

(C1, C2, C3) : Partition Key가 C1 이고, Clustering key가 C2, C3인 경우, 괄호가 없다면 첫번째 컬럼 C1을 제외한 나머지 항목들은 Clustering Key로 지정된다. 

 

(C1, (C2, C3)) : Partition Key가 C1 이고, Clustering key가 C2, C3인 경우, 괄호가 첫번째 컬럼 C1을 제외한 나머지 항목들을 묶고 있다면 두번째 항목들은 (C1, C2, C3) 경우와 동일한 Clustering Key로 지정된다. 

 

((C1, C2), (C3, C4)) : Partition Key가 C1, C2 이고, Clustering key가 C2, C4인 경우. Partition Key를 여러 개 지정하고 싶다면 괄호로 묶어서 사용하면 된다. 

 

[참고 사이트]

 

3. SELECT 쿼리시 Partition Key와 Clustering Key만 사용할수 있도록 테이블을 설계하자.

카산드라는 SELECT를 실행할 때, 테이블을 생성한대로 Partition Key와 Clustering Key만 사용하여 SELECT를 해오는 것이 기본으로 한다. 자세한 원칙들을 아래에 정리하였다.

 

예를 들어 아래와 같은 car 테이블 생성 했다고 가정하자.

CREATE TABLE car {

  name text,

  door int,

  wheel int,

  window int,

PRIMARY KEY(name, (door, wheel)) }

 

원칙 1. Where 절에는 Partition Key와 Clustering Key만 사용할수 있다.

올바른 예 : select * from car where name ='kia';
잘못된 예 : select * from car where window =1;

 

원칙 2. Partition Key는 단독으로 사용할수 있지만, Clustering Key를 사용할땐, Partition Key를 먼저 조건에 추가해줘야한다.

 

올바른 예 : select * from car where name ='kia'; | select * from car where name ='kia' and door = 1;
잘못된 예 : select * from car where door =1;

 

원칙 3. Clustering Key는 Table에 생성시 지정한 Clustering 순서대로 순서대로 사용해야한다.  

 

올바른 예 : select * from car where name ='kia' and door = 1 and wheel = 4;
잘못된 예 : select * from car where name ='kia' and wheel = 4 and door = 1;

 

하지만, 잘못된 예라고 표기한 SELECT 문을 필요에 따라 실행해야하는 경우도 있다. 

그럴때 ALLOW FILETERING을 사용하면 강제로 데이터를 가져올 순 있다.

하지만 ......  별로 추천 하지 않는 방법이다. 그 이유는 4번 문항을 참고하면 된다. 

 

 

4. SELECT쿼리시 ALLOW FILETERING 사용자제

다시 ,아래와 같은 테이블이 있다고 가정하자.

 

CREATE TABLE car {

  name text,

  door int,

  wheel int,

  window int,

PRIMARY KEY(name, (door, wheel)) }

 

Car라는 테이블의 데이터를 가져올때, 아래의 쿼리문은 오류가 발행한다. 

 

Select * from car where door =3;

 

굳이 실행하여 데이터를 사용 싶다면 ALLOW FILTERING 을 사용하면되는데, 이는 추천하지 않는 방법이다. 

추천하지 않는 가장 큰 이유는 SELECT 실행 속도 저하이다.

 

카산드라는 내부에 Partition Key를 기준으로 덩어리로 구분짓고, 그안에 Clustering Key가 순서대로 저장 한다. 

그래서 Select 쿼리시에도 Where절 사용시 Partition Key를 필수적으로 들어가야한다. 그럴때, Partition 기준으로 저장되어 있는 데이터를 가장 빠르고 효율적으로 가져올 수 있다. 

 

Select * from car where name ='kia';

위와 같은 쿼리는 name으로 구분되어 있는 덩어리에서 kia인 덩어리 데이터만 빠르게 가져올 수 있다.

 

Select * from car where door =3 allow filtering;

위와 같은 쿼리는 door가 3인 데이터를 모든 덩어리(=Partition)마다 다 찾아봐야하기 때문에 시간이 오래걸린다.

 

테스트 환경에서 확인할 데이터가 있을때 잠깐  사용하는건 어쩔수 없지만, 

실제 운영에서는 allow filtering을 사용해야 데이터를 가져올수 있는 경우라면 테이블 설계부터 다시 고려해볼 것을 권장한다.

 

 

[DATASTAX]