본문 바로가기
Snowflake

[Snowflake] 웨어하우스 캐시 최적화

by heed159 2024. 12. 17.

Result Cache(Object Storage 사용) & Data Cache(Block Storage 사용)

Result Cache

개인적으로 Snowflake의 여러가지 장점 중 하나는 동일한 쿼리를 24시간 이내에 재수행한다면 Result Cache를 사용하여 결과를 Return 한다는 것이다. 이는 User가 이미 실행한 쿼리를 반복하고 쿼리의 마지막 수행 이후에 테이블의 데이터가 변화하지 않았다면, Snowflake는 쿼리를 실행하지 않고 캐시에서 직접 해당 결과를 검색하므로 쿼리 시간을 크게 단축시킬 수 있게 된다. 이러한 이유는 쿼리를 실행한 결과가 S3에 저장되기 때문에 24시간동안 많은 양의 쿼리가 수행되어도 S3에 저장되어 있어서 빠르게 결과를 가져올 수 있게 되는 것이다.

아래 간단한 예시를 보며 확인해보자.

SELECT CUSTID, SPENDLIMIT
  FROM HEE_SCHEMA.CUST_INFO
 ;

 

왼쪽 그림은 첫번째로 쿼리를 수행한 결과이고 오른쪽 그림은 바로 동일한 쿼리를 수행한 결과이다. 쿼리 수행 시간이 1.4s에서 26ms 로 크게 향상된 것을 볼 수 있다. 이는 앞서 설명한 바와 같이 쿼리를 재수행하는 것이 아니라 Result Cache에서 결과를 가져오기 때문에 이러한 속도를 확인할 수 있다. 

Result Cache를 사용한 경우의 Query Profile를 확인해보면 아래와 같이 Result Cache에서 쿼리를 가져왔다는 것을 알 수 있다. 

 

물론 Result Cache에서 데이터를 가져오려면 여러가지 조건이 맞아야 한다. 참고로 Snowflake에서는 이러한 모든 조건을 충족한다고 해서 Result Cache를 재사용하는 것이 보장되지 않는다고 설명한다.

  • 새로운 쿼리가 이전에 실행한 쿼리와 정확하게 일치
  • 쿼리 결과에 영향을 주는 테이블 데이터가 변경되지 않음
  • 쿼리를 수행하고 24시간 이내에 재수행 필요
  • 이하 생략
SELECT DISTINCT(severity) FROM weather_events;
SELECT DISTINCT(severity) FROM weather_events;
SELECT DISTINCT(severity) FROM weather_events we;
select distinct(severity) from weather_events;

두 번째 쿼리는 Result Cache를 사용하지만 세 번째와 네 번째와 같이 alias를 사용한다거나 소문자를 사용한다면 이는 Result Cache를 사용하지 않게 된다. 

참고로 아래와 같이 Result Cache를 사용하지 않도록 지정할 수도 있다. 특정 세션에서만 끄는 옵션이다.

ALTER SESSION SET USE_CACHED_RESULT = FALSE;

 

Result Cache는 쿼리가 처음 실행된 시간으로부터 최대 31일까지 결과에 대한 24시간 보존 기간을 재설정한다.

 

Data Cache

Data Cache의 경우 쿼리를 수행했던 웨어하우스가 Suspend 되기 전에 동일 또는 비슷한 쿼리가 수행될 경우, Snowflake는 Block Storage에서 데이터를 가져오기 때문에 조회 속도가 빨라질 수 있다. 하지만 이는 무조건 동일한 웨어하우스여야 하며, 해당 웨어하우스가 Suspend 되면 이러한 효과를 가져올 수 없다. 또한 멀티 클러스터로 수행할 경우 쿼리를 수행한 클러스터 넘버가 다르면 Data Cache가 사용되지 않는다. 무조건 동일한 클러스터가 동일 또는 비슷한 쿼리를 수행할 경우에만 Data Cache를 사용할 수 있다는 것이다.(이러한 이유 때문에 멀티 클러스터를 사용할 경우 Data Cache를 사용하는 것은 거의 운이다)

따라서 PoC 같은 특수한 환경에서는 동일 또는 반복 작업이 대다수이기 때문에 싱글 웨어하우스를 사용할 경우 배치 또는 여러 쿼리 시나리오에서 웨어하우스가 Suspend 되기 전에 동일 또는 비슷한 쿼리를 반복 작업한다면 성능이 개선될 여지가 있다. 실제로 PoC 수행 중 배치 또는 무거운 쿼리를 수행할 경우, 첫 번째로 수행한 결과보다 두 번째로 수행한 결과의 성능이 더 향상되는 것을 볼 수 있었다.