쿼리 최적화 전략

BigQuery 입문

Matt Forrest

Field CTO

세 가지 원칙

세 가지 핵심 규칙:

  1. 처리해야 할 데이터 양을 줄입니다.
  2. 쿼리 연산을 최적화합니다.
  3. 쿼리 출력 크기를 줄입니다.
1 https://cloud.google.com/bigquery/docs/best-practices-performance-compute#use-bi-engine
BigQuery 입문

데이터 양 줄이기

  • SELECT *는 피하고, 필요한 열만 선택합니다.
  • CTE에서 데이터를 가능한 한 일찍, 자주 필터링합니다.
  • WHERE 절로 데이터를 일찍, 자주 필터링합니다.
BigQuery 입문

조인 최적화

  • CTE로 필요한 데이터만 줄이십시오.
  • 조인은 INT64 데이터 타입을 사용합니다.
WITH filter_my_data AS (SELECT 
-- Filter data with 
-- WHERE in the CTE first
)
SELECT 
-- This query will run 
-- faster with less data
JOIN a USING (user_id)
BigQuery 입문

`WHERE` 절 최적화

  • BigQuery에서는 다음을 사용합니다.

    • BOOL
    • INT
    • FLOAT
    • DATE
  • WHERE에서 STRING 또는 BYTE 사용은 비최적입니다.

비최적

SELECT user_id, date_ordered
FROM dataset.table
WHERE product = 'shoes'

최적

SELECT user_id, date_ordered
FROM dataset.table
WHERE product_id = 1234
BigQuery 입문

ORDER BY 최적화

  • ORDER BY는 항상 쿼리의 가장 바깥(끝)에 둡니다.
  • 예외는 윈도 함수 절 내부에서 ORDER BY를 쓰는 경우뿐입니다.
BigQuery 입문

최적화 없는 ORDER BY

비최적

WITH order_total AS (SELECT
user_id,           
sum(product_price) as order_sum
FROM orders
GROUP BY user_id   
-- Order by is not at the end of the query
ORDER BY last_purchase_date
)
SELECT order_total.order_sum, 
users.user_name
FROM dataset.users users
JOIN order_total USING (user_id);
BigQuery 입문

최적화된 ORDER BY

최적

WITH order_total AS (SELECT
user_id,    
last_purchase_date
sum(product_price) as order_sum
GROUP BY user_id         
)
SELECT order_total.order_sum, 
users.user_name
FROM dataset.users users
JOIN a USING (user_id)
-- Order by should always be at the end
ORDER BY orders_total.last_purchase_date;
BigQuery 입문

EXISTS vs. COUNT 사용하기

  • 테이블에 레코드 존재 여부만 필요하면 EXISTS를 사용합니다.
  • 이 경우 COUNT 사용은 피합니다.
SELECT EXISTS (

  -- Write the main query as a subquery within the exists call
  SELECT
    user_id
  FROM
    dataset.table
  WHERE
    product_category = 'home_goods'
    AND status = 'Closed Account'
);
BigQuery 입문

기타 최적화 방법

  • APPROX_TOP_SUM, APPROX_COUNT_DISTINCT 같은 근사 집계를 사용합니다.
  • 많은 BigQuery 테이블은 날짜로 파티션됩니다. WHERE 절에 날짜를 포함합니다.
BigQuery 입문

실습해 봅시다!

BigQuery 입문

Preparing Video For Download...