Redshift는 일반적인 RDBMS와 달리, Index 키를 사용하지 않기 때문에 Scan 방식을 결정하는 유일한 변수가 Table 의 Sortkey이다. Sortkey는 테이블의 데이터를 정렬하여 디스크에 저장하는 방식을 결정한다. 테이블의 데이터가 정렬된 비율이 높을수록 쿼리 플래너가 보다 정확한 실행 계획을 생성할 수 있다.
Redshift는 특정 데이터가 저장된 블록을 찾기 위해서 Zonemap 방식을 사용하는데, 해당 방식을 사용하기 위해서 Sortkey 설정이 필요하다.
존맵(ZoneMap)이란
데이터 프루닝 방식(필요한 블록만 조회해 디스크 I/O를 줄이는 방식)을 통해 데이터를 조회하는 방식이다. 블록의 존맵은 컴퓨팅 노드의 메모리에 저장되어 사용된다.
블록에는 칼럼별 데이터 범위(최소, 최대)가 저장된다. 조회 쿼리에서 사용되는 조회조건 값이 소속되는 블록을 찾아 조회하기 때문에, 전체를 스캔하는 방식에 비해 스캔 속도가 빠르다.
1) 단일 소트키 : 한 개의 칼럼을 소트키로 지정하여 사용하는 방식이다. 소트키는 인코딩 방식을 Raw로 사용하는 것이 좋다.
2) 복합 소트키(Compound Sorkey) : 복수의 칼럼을 정렬키로 지정하여 사용하는 방식이다. 복합 소트키에서의 정렬 순서는 복합 소트키로 지정된 칼럼의 순서에 따른다. 따라서, 복합 소트키에서 scan 성능의 이점을 갖기 위해서는 반드시, 정렬키 순서에 따라서 조회조건을 사용해야 한다.
EX) COMPOUND SORTKEY (SORTKEY 1, SORTKEY 2)
Best Case : 데이터 블록에서 값을 추출한다.
WHERE Sortkey 1 = 1
AND Sortgey 2 = 2
Medium Case : 데이터 블록 안에서 scan 이후 값을 추출 한다.
WHERE Sortkey 1 = 1
Worst Case : 모든 데이터를 seq_scan 하게 된다.
WHERE Sortkey 2 = 2
3) 인터리브(Interleaved) 정렬 키 : 복수의 칼럼을 정렬키로 지정하고, 각 키의 하위집합에 똑같은 가중치를 부여한다. 복합 소트키에서 소트키의 순서에 따라서 선행하는 소트키가 가중치를 모두 가져가는 경우와 달리, 인터리브 정렬키에서는 각 정렬키가 동등한 가중치를 가지게 된다. 따라서, 각 블록에는 정렬키 별로 동일한 수의 값이 할당된다.
인터리브 정렬키는 Where 조건 절에서 1개 이상의 정렬 키를 기준으로 필터링하여 적은 범위의 값을 조회할 때 효과적이다.
EX) INTERLEAVED SORTKEY (SORTKEY 1, SORTKEY 2)
Best Case : Sortkey 1 = 1인 블록 AND Sortkey 2 = 2인 블록을 조회한다.
WHERE Sortkey 1 = 1
AND Sortgey 2 = 2
Medium Case : Sortkey 1 = 1인 블록 OR Sortkey 2 = 2인 블록을 조회한다.
WHERE Sortkey 1 = 1
OR
WHERE Sortkey 2 = 2