Snowflake가 중복 조인을 제거하는 방식 이해하기
Snowflake가 중복 조인을 제거하는 방식 이해하기 (Understanding How Snowflake Can Eliminate Redundant Joins)
어떤 경우에는 키 컬럼에 대한 조인이 조인에 필요하지 않은 테이블을 참조할 수 있어요. 테이블에 키 컬럼이 있고 UNIQUE, PRIMARY KEY, FOREIGN KEY 제약 조건을 사용·강제한다면, Snowflake가 키 컬럼에 대한 불필요한 조인을 제거해 쿼리 성능을 개선할 수 있어요.
이 최적화는 테이블의 데이터가 기본 키와 외래 키 관련 제약 조건을 준수한다는 것을 나타내기 위해 RELY 제약 조건 속성을 사용할 때만 수행돼요.
출처: Understanding How Snowflake Can Eliminate Redundant Joins
본문
불필요한 조인을 제거하기 위한 RELY 제약 조건 속성 설정
Snowflake는 테이블의 데이터가 UNIQUE, PRIMARY KEY, FOREIGN KEY 제약 조건을 준수한다는 것을 표시할 때만 조인에 이 최적화를 수행해요.
지원되는 제약 조건 유형에서 언급했듯이 Snowflake는 표준 테이블에서는 UNIQUE, PRIMARY KEY, FOREIGN KEY 제약 조건을 강제하지 않지만, 하이브리드 테이블에서는 강제해요. 표준 테이블의 경우 데이터에 대한 제약 조건을 강제하는 책임은 사용자에게 있어요.
데이터가 이러한 제약 조건을 준수한다는 것을 확인했고 Snowflake가 불필요한 조인을 제거하기를 원한다면, UNIQUE, PRIMARY KEY, FOREIGN KEY 제약 조건에 RELY 제약 조건 속성을 설정하세요.
참고: 제약 조건(UNIQUE, PRIMARY KEY, FOREIGN KEY)의 무결성을 유지하는 것은 사용자의 책임이에요. 제약 조건의 무결성이 유지되지 않으면 RELY 제약 조건 속성이 설정된 경우 쿼리 결과가 (NORELY일 때의 결과와 비교해) 달라질 수 있어요.
불필요한 조인 제거 예제
다음 예제들은 Snowflake가 필요한 테이블에 대한 조인과 참조를 제거하는 경우를 보여줘요:
- 예제 1: 불필요한 LEFT OUTER JOIN 제거
- 예제 2: 불필요한 자기 조인(SELF-JOIN) 제거
- 예제 3: 기본 키와 외래 키에 대한 불필요한 조인 제거
이 예제들에서:
dim_products는 구매 가능한 각 제품에 대해 하나의 행을 포함하는 테이블이에요. 이 테이블에서product_id는 제품을 고유하게 식별하는 컬럼이에요.fact_sales는 각 제품 판매에 대해 하나의 행을 포함하는 테이블이에요. 이 테이블에서product_id는 판매된 제품을 식별하는 컬럼이에요. 이 컬럼의 ID는dim_products테이블의product_id컬럼의 ID에 대응돼요.
예제 1: 불필요한 LEFT OUTER JOIN 제거
다음은 Snowflake가 최적화할 수 있는 불필요한 left outer join의 예시예요:
SELECT f.*
FROM fact_sales f
LEFT OUTER JOIN dim_products p
ON f.product_id = p.product_id;
이 조인은 문이 오른쪽 dim_products 테이블의 (조인용 기본 키 컬럼 외에는) 어떤 컬럼도 참조하지 않기 때문에 불필요해요.
dim_products.product_id 컬럼이 RELY 속성을 가진 UNIQUE 또는 PRIMARY KEY 제약 조건을 가지면, Snowflake는 이 조인을 불필요하다고 식별하고 오른쪽 dim_products 테이블에 대한 참조를 제거할 수 있어요.
예제 2: 불필요한 자기 조인(SELF-JOIN) 제거
다음은 Snowflake가 최적화할 수 있는 불필요한 자기 조인의 예시예요:
SELECT p1.product_id, p2.product_name
FROM dim_products p1, dim_products p2
WHERE p1.product_id = p2.product_id;
이 문은 dim_products 테이블을 자기 자신과 불필요하게 조인하고 해당 테이블에서 컬럼을 선택해요.
dim_products.product_id 컬럼이 RELY 속성을 가진 UNIQUE 또는 PRIMARY KEY 제약 조건을 가지면, Snowflake는 이 조인을 불필요하다고 식별하고 오른쪽 dim_products 테이블에 대한 참조를 제거할 수 있어요.
예제 3: 기본 키와 외래 키에 대한 불필요한 조인 제거
다음은 Snowflake가 최적화할 수 있는 불필요한 inner join의 예시예요:
SELECT p.product_id, f.units_sold
FROM fact_sales f, dim_products p
WHERE f.product_id = p.product_id;
이 문은 조인용 기본 키 컬럼 외에는 오른쪽 dim_products 테이블의 어떤 컬럼도 참조하지 않아요.
dim_products.product_id 컬럼이 PRIMARY KEY 제약 조건을 갖고 fact_sales.product_id 컬럼이 FOREIGN KEY 제약 조건을 가지면, Snowflake는 이 조인을 불필요하다고 식별하고 오른쪽 dim_products 테이블에 대한 참조를 제거할 수 있어요.