테이블 클러스터링 및 모니터링
SNOWFLAKE의 데이터베이스를 구성하는 다양한 테이블들은 사용자의 요구사항에 맞춰서 언제든지 원하는 컬럼을 사용하여 클러스터링을 수행할 수 있습니다.
SNOWFLAKE 테이블 클러스터링은 특정 컬럼의 동일한 값들이 MICRO-PARTITION 내에 정렬된 상태로 구성되어 다양한 필터 조건 및 조인 조건에 맞는 소수의 MICRO-PARTITION만 프로세싱을 수행하여 파일에 대한 스캔 비율을 낮추어 성능을 향상 시키는 방식입니다.
NATURAL ORDERING CLUSTER
SNOWFLAKE 테이블로 데이터가 수집될 때, 특별한 CLUSTER KEY를 지정하지 않으신 경우를 NATURAL ORDERING CLUSTER 상태라고 얘기합니다.
이 때 클러스터링이 되는 기준은 단순하게 MICRO-PARTITON을 특정 사이즈(압축 후 16MB)로 만드는 기준이 적용됩니다. 특정한 KEY 가 정의되어 있지 않기 때문에, 데이터 조회 시 필요한 데이터만 스캔하지 않는 다고 생각이 될 수 있지만, 특정 상황에서는 Pruning이 효율적으로 발생할 수 있습니다.
아래의 그림 처럼, 데이터를 일배치 형태로 SNOWFLAKE 테이블로 수집할 때, 자연스럽게 날짜별로 파티셔닝이 발생합니다.
SNOWFLAKE는 데이터를 수집할 때, 메타레이어에 각 마이크로파티션을 구성하는 컬럼의 MIN-MAX 값을 저장하여, 조회가 발생할 때 해당 조건에 맞는 값이 MIN-MAX 범위 안에 있는 마이크로파티션만 스캔하게 됩니다.
date 컬럼을 기준으로 위의 마이크로 파티션과 관련된 MIN-MAX 값은 아래와 같습니다.
MICRO-PARTITION1 : DATE MIN : 11/2, DATE MAX : 11/2
MICRO-PARTITION2 : DATE MIN : 11/2, DATE MAX : 11/3
MICRO-PARTITION3 : DATE MIN : 11/2, DATE MAX : 11/4
MICRO-PARTITION4 : DATE MIN : 11/3, DATE MAX : 11/5
위와 같이 구성된 상태에서 11월 4일 데이터를 검색하면 MIN-MAX 범위에 존재하는 MP3, MP4번(MIN-MAX 범위 안)의 파일만 스캔하여 처리가 됩니다.
이렇게 때문에 항상 Full Scan이 발생하는 것은 아니며, 아래와 같은 상황에서는 자연스럽게 클러스터링이 되기 때문에 충분한 성능을 발휘할 수 있습니다.
- 배치 작업을 통해 하루 전 데이터를 주기적으로 수집 시, 날짜 컬럼은 자연스럽게 클러스터링이 될 수 있습니다.
- SNOWFLAKE 테이블을 삭제 후, BULK로 데이터 로딩 시 ORDER BY를 통해 자연스럽게 특정 컬럼을 클러스터링 할 수 있습니다.
AUTOMATIC CLUSTERING
위와 같이 NATURAL CLUSTERING을 통해서도 일부 파일 스캔 시 파티션을 통한 성능 향상을 기대할 수 있으나, 명시적으로 컬럼을 통해 정렬한 테이블보다는 성능이 느리게 됩니다. 또한 날짜 컬럼이 아닌 경우 위와 같은 전제도 더 이상 적용하기 어려운 부분이 있습니다.
이럴 경우 SNOWFLAKE 테이블에 CLUSTER BY 옵션을 설정하여 원하는 컬럼을 기준으로 데이터를 정렬할 수 있으며, 아래와 같은 특장점을 제공합니다.
- 사용자의 요구사항에 맞춰 언제든지 CLUSTERING KEY를 변경할 수 있습니다.
- 현재 수행중인 쿼리에는 영향을 미치지 않고, 백그라운드 프로세스에서 클러스터링을 보정하는 작업을 수행합니다.
- CLUSTERING 서비스는 자동으로 동작하며, CLUSTERING 정도가 낮을 경우 해당 프로세스가 동작합니다.
위와 같이 클러스터링이 완료된 후 동일 쿼리(11/4일 데이터 조회)를 수행할 경우 MP8번만 데이터 스캔을 수행할 수 있기 때문에 좀 더 빠르게 데이터 프로세싱이 가능합니다.
CLUSTERING DEPTH에 대한 이해
해당 테이블에 대한 클러스터링의 효율성 유무를 확인하기 위한 함수를 제공하고 있으며, 이에 대한 OUTPUT 값을 이해하기 위해서는 CLUSTERING DEPTH에 대해서 먼저 이해가 필요합니다.
위의 예제는 5개의 마이크로파티션으로 구성된 테이블이며, 각 단계별로 다른 Depth를 표현하고 있습니다.
Depth는 특정 값이 주어졌을 때, 스캔해야 하는 MP 파일의 수를 의미합니다.
맨 상단의 마이크로파티션(회색 바로 표현)은 모두 A-Z 사이의 MIN-MAX 범위를 가지고 있습니다. 그렇기 때문에 사용자가 R이라는 값을 검색할 때 5개의 MP 파일을 스캔해야 합니다.
3번째 그림 역시 클러스터링이 되어 있어 A를 검색할 때는 하나의 MP 파일만 보면 되지만, R을 검색할 경우 Q-Z, L-S 로 구성된 2개의 MP 파일을 스캔해야 합니다.
그렇기 때문에 잘 클러스터링 된 테이블은 MIN-MAX 값들이 서로 오버랩되지 않으며, DEPTH가 항상 1인 테이블이 상태라고 할 수 있습니다.
TABLE CLUSTERING 모니터링 하기
SNOWFLAKE는 명시적으로 CLUSTER KEY 옵션의 유무와 상관없이 파티셔닝을 수행(NATURAL CLUSTRING)한다고 말씀드렸습니다. 그렇기 때문에 해당 테이블에 대한 데이터 클러스터링 정도를 확인하기 위한 함수를 제공하고 있으며, 이를 통해서 특정 컬럼을 조회할 경우 얼마나 효율적으로 마이크로파티션을 사용할 수 있는지 사전에 확인할 수 있습니다.
SYSTEM$CLUSTERING_INFORMATION 함수는 테이블에 대한 depth, overlap의 정도를 파악하여 특정 컬럼이 클러스터링이 잘되어 있는지를 확인할 수 있는 기능을 제공합니다.
위의 이미지는 테이블(TEST2)에 대해 (COL1, COL3) 컬럼에 대한 클러스터링 상태를 확인한 결과입니다.
총 1156개의 마이크로파티션 파일로 구성
평균 117의 파티션들이 MIN-MAX의 값들이 중첩되어 있으며, 조회 시 평균 64개의 파일을 스캔하게 됨.
사용자는 위와 같은 함수를 사용하여 각 테이블의 클러스터링 정보를 확인하여 클러스터링 키/방식의 효용성등을 확인하여 성능 개선을 수행할 수 있습니다.