데이터 타입과 클러스터 키 간의 영향도 알아보기

Youngtae Kim
Snowflake Korea
Published in
7 min readOct 23, 2023

들어가며

안녕하세요!
오늘은 Snowflake의 데이터 타입과 클러스터 키에 대해
몇 가지 테스트를 해보도록 하겠습니다.

이전 스토리에서

  • NATURAL ORDERING CLUSTER
  • AUTOMATIC CLUSTERING
  • CLUSTERING DEPTH에 대한 이해
  • TABLE CLUSTERING 모니터링 하기
    등이 궁금하다면 여기 링크를 참조해 주세요.

시나리오

이번 테스트는 TPC-H를 이용하겠습니다.
관련 스키마에 대한 설명이 궁금하시면 여기 링크를 참조해 주세요.

최근 몇 년간 주문 상세데이터는 지속적으로 늘어 60억건에 이르렀습니다.
고객은 매년 첫째날(1월1일)을 필터조건을 넣고 count를 하려고 하니
생각보다 느려짐을 인지하였습니다.

분명 테이블을 만들때 클러스터키를 적용 하였는데..
왜 느려진 건지 테스트를 하면서 같이 확인해 보시죠.

시나리오를 수행하기 전에 사전에 느려지는 상황을 만들어 보겠습니다.

사전 설정

use warehouse compute_wh;
/* medium 데이터베이스를 생성합니다. */
create or replace database medium;
/* 테이블을 생성할 데이터베이스와 스키마를 컨텍스트로 지정합니다. */
use database medium;
use schema public;

-- 적재시간을 줄이기 위해 warehouse_size 를 x2large로 변경합니다.
alter warehouse compute_wh set warehouse_size=x2large;

-- result cache 사용하지 않음
alter account set use_cached_result = false;

--L_SHIPDATE컬럼 데이터 타입이 문자열(varchar)임을 가정합니다.
--varchar type cluster 구성
create or replace table medium.public.lineitem_varchar
cluster by (L_SHIPDATE)
as
select * exclude(L_SHIPDATE, L_COMMITDATE, L_RECEIPTDATE)
, to_char(L_SHIPDATE) L_SHIPDATE
, to_char(L_COMMITDATE) L_COMMITDATE
, to_char(L_RECEIPTDATE) L_RECEIPTDATE
from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1000.LINEITEM
;
/*
각각의 계정 마다 조금씩 다르겠지만 x2large(Warehouse Size)기준
medium.public.lineitem_varchar(60억건)를 만들때 대략 4분30초 가량 소요됩니다.
*/

성능측정

-- warehouse_size 를 xsmall로 줄여서 테스트 합니다.
alter warehouse compute_wh set warehouse_size=xsmall;

select count(*)
from medium.public.lineitem_varchar
where L_SHIPDATE in ('1993-01-01','1994-01-01','1995-01-01','1996-01-01','1997-01-01','1998-01-01')
;
  • 위의 쿼리는 10초 내외로 수행 되었습니다.
  • query profile을 확인하면 table scan이 생각보다 큼을 알 수 있습니다.
  • 전체 9728개 Micro-Partition 중에서 3995개를 scan 하였습니다(약 41%)

문자열 클러스터키에 대한 관련 링크 클러스터링 키 및 클러스터링된 테이블 | Snowflake Documentation 를 확인해보면 “텍스트 필드에서 클러스터링할 때 클러스터 키 메타데이터는 처음 몇 바이트만 추적합니다(보통 5~6바이트 정도).” 라고 설명되어 있습니다.

그래서 위의 테스트에서 대량의 Micro-Partition을 scan 한 이유가 설명이 됩니다.(문자열에서 ‘1993–01–01’ 는 10 바이트)

추가 설정

만약 L_SHIPDATE컬럼 데이터 타입이 변경 가능하다면 아래와 같이 추가 테스트를 진행 할 수 있습니다.

-- 적재시간을 줄이기 위해 warehouse_size 를 x2large로 변경합니다. 
alter warehouse compute_wh set warehouse_size=x2large;
--date type cluster 구성
create or replace table medium.public.lineitem_date
cluster by (L_SHIPDATE)
as
select * exclude(L_SHIPDATE, L_COMMITDATE, L_RECEIPTDATE)
, to_date(L_SHIPDATE) L_SHIPDATE
, to_date(L_COMMITDATE) L_COMMITDATE
, to_date(L_RECEIPTDATE) L_RECEIPTDATE
from medium.public.lineitem_varchar
;

성능측정

-- warehouse_size 를 xsmall로 줄여서 테스트 합니다.
alter warehouse compute_wh set warehouse_size=xsmall;

select count(*)
from medium.public.lineitem_date
where L_SHIPDATE in ('1993-01-01','1994-01-01','1995-01-01','1996-01-01','1997-01-01','1998-01-01')
;
  • 1초 내외로 수행 되었습니다.
  • 전체 9369개 Micro-Partition 중에서 11개를 scan 하였습니다(약 0.12%)
  • 같은 조건 임에도 11개 Partition 만 scan 하였습니다
  • 기존 문자열 클러스터의 형태보다 41.07% 에서 0.12%로 대폭 개선되었습니다.

정리하며

cluster key를 설정 할때 data type이 얼마나 영향을 주는지 알게 되었습니다.

이번 테스트에서 얻은 정보를 정리하면 다음과 같습니다.

  • 날짜 형태의 컬럼은 가능하면 date type을 사용한다.
  • 텍스트 형태의 컬럼은 클러스터링할 때 클러스터 키 메타데이터는 처음 몇 바이트(5~6)만 인지하므로 5~6 바이트 미만의 컬럼이 아니라면 cluster key 효과를 보기 힘들다.

감사합니다.

--

--