Snowflake 쿼리 최적화

Snowflake SQL 입문

George Boorman

Senior Curriculum Manager, DataCamp

왜 Snowflake 쿼리를 최적화할까요?

  • 더 빠른 결과
  • 비용 효율성
    • 짧은 실행 시간은 CPU·메모리 같은 자원 사용을 줄입니다.

CPU·메모리 과다 사용이 비용 증가로 이어짐

Snowflake SQL 입문

일반적인 쿼리 문제

  • 폭발적 조인: 주의하세요!

잘못된 예

SELECT *
FROM order_details AS od
JOIN pizzas AS p -- ON 조건 누락으로 폭발적 조인 발생

ON 조건 없이 실행한 결과의 행·시간 세부정보

Snowflake SQL 입문

일반적인 쿼리 문제

  • 폭발적 조인: 주의하세요!

올바른 예

SELECT *
FROM order_details AS od
JOIN pizzas AS p
ON od.pizza_id = p.pizza_id

ON 조건 포함 시 결과의 행·시간 세부정보

Snowflake SQL 입문

일반적인 쿼리 문제

  • UNION vs UNION ALL 차이 이해
    • UNION은 중복 제거로 느림
    • 중복이 없다면 UNION ALL이 더 빠름
  • 대용량 데이터 처리
    • 필터로 범위 축소
    • 빠른 결과를 위해 LIMIT 사용
Snowflake SQL 입문

쿼리를 어떻게 최적화할까요?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

쿼리 세부정보, 시간 및 행 수

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

LIMIT 10 사용 시 시간·행 세부정보

Snowflake SQL 입문

쿼리를 어떻게 최적화할까요?

SELECT * 사용 ⌛

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

쿼리 세부정보, 시간 및 행 수

SELECT * 피하기 ⚡

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

열 이름을 선택해 실행 시간·행 수 표시

Snowflake SQL 입문

쿼리를 어떻게 최적화할까요?

먼저 필터링

  • 초기에 WHERE 절 사용
  • JOIN 전에 필터 적용
    • JOIN에서 처리할 행 수 감소
Snowflake SQL 입문

초기 필터링 없이

SELECT orders.order_id, 
       orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM orders
JOIN order_details 
ON orders.order_id = order_details.order_id
JOIN pizzas 
ON order_details.pizza_id = pizzas.pizza_id
JOIN pizza_type 
ON pizzas.pizza_type_id = pizza_type.pizza_type_id
WHERE orders.order_date = '2015-01-01';  -- JOIN 후 필터링
Snowflake SQL 입문

초기 필터링 적용

WITH filtered_orders AS (
  SELECT *
  FROM orders
  WHERE order_date = '2015-01-01'  -- JOIN 전 CTE에서 필터링
)
SELECT filtered_orders.order_id, 
       filtered_orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM filtered_orders -- CTE와 조인
JOIN order_details
ON filtered_orders.order_id = order_details.order_id
JOIN pizzas
ON order_details.pizza_id = pizzas.pizza_id
JOIN pizza_type
ON pizzas.pizza_type_id = pizza_type.pizza_type_id;
Snowflake SQL 입문

쿼리 이력

  • Query History
    • snowflake.account_usage.query_history
    • 실행 시간 등 다양한 지표 제공
SELECT query_text, start_time, end_time, execution_time 
FROM
   snowflake.account_usage.query_history
WHERE query_text ILIKE '%order_details%'

실행 이력 스크린샷

  • ILIKE: 대/소문자 구분 없는 문자열 매칭
Snowflake SQL 입문

쿼리 이력

  • 느리거나 자주 실행되는 쿼리 식별
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

execution_time > 1000ms로 필터링한 결과

Snowflake SQL 입문

연습해 봅시다!

Snowflake SQL 입문

Preparing Video For Download...