Snowflake가 중복 조인을 제거하는 방법 이해하기

어떤 경우에는 키 열의 조인이 조인에 필요하지 않은 테이블을 참조할 수 있습니다. 테이블에 키 열이 있고 UNIQUE, PRIMARY KEY 및 FOREIGN KEY 제약 조건을 사용하고 적용하는 경우 Snowflake는 키 열에서 불필요한 조인을 제거하여 쿼리 성능을 개선할 수 있습니다.

RELY 제약 조건 속성을 사용하여 테이블의 데이터가 기본 키 및 외래 키와 관련된 제약 조건을 준수함을 나타내는 경우에만 이러한 최적화가 수행됩니다.

이 항목의 내용:

불필요한 조인을 제거하도록 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에서 필요하지 않은 테이블에 대한 조인과 참조를 제거하는 경우를 보여줍니다.

다음과 같은 예를 생각해 보겠습니다.

  • dim_products 는 구매할 수 있는 각 제품에 대한 행이 포함된 테이블입니다.

    이 테이블에서 product_id 는 제품을 고유하게 식별하는 열입니다.

  • fact_sales 는 각 제품 판매에 대한 행이 포함된 테이블입니다.

    이 테이블에서 product_id 는 판매된 제품을 식별하는 열입니다. 이 열의 ID는 dim_products 테이블의 product_id 열에 있는 ID에 해당합니다.

예 1: 불필요한 왼쪽 외부 조인 제거

다음은 Snowflake가 최적화할 수 있는 불필요한 왼쪽 외부 조인의 예입니다.

SELECT f.*
FROM fact_sales f
LEFT OUTER JOIN dim_products p
ON f.product_id = p.product_id;
Copy

(조인에 대한 기본 키 열 이외에) 문이 오른쪽에 있는 dim_products 테이블의 어떤 열도 참조하지 않으므로 조인이 불필요합니다.

dim_products.product_id 열에 RELY 속성이 있는 UNIQUE 또는 PRIMARY KEY 제약 조건이 있는 경우 Snowflake는 이 조인을 불필요한 것으로 식별하고 오른쪽에 있는 dim_products 테이블에 대한 참조를 제거할 수 있습니다.

예 2: 불필요한 자체 조인 제거

다음은 Snowflake가 최적화할 수 있는 불필요한 자체 조인의 예입니다.

SELECT p1.product_id, p2.product_name
FROM dim_products p1, dim_products p2
WHERE p1.product_id = p2.product_id;
Copy

이 문은 dim_products 테이블을 그 자신과 불필요하게 조인하고 해당 테이블에서 열을 선택합니다.

dim_products.product_id 열에 RELY 속성이 있는 UNIQUE 또는 PRIMARY KEY 제약 조건이 있는 경우 Snowflake는 이 조인을 불필요한 것으로 식별하고 오른쪽에 있는 dim_products 테이블에 대한 참조를 제거할 수 있습니다.

예 3: 기본 키 및 외래 키에서 불필요한 조인 제거

다음은 Snowflake가 최적화할 수 있는 불필요한 내부 조인의 예입니다.

SELECT p.product_id, f.units_sold
FROM   fact_sales f, dim_products p
WHERE  f.product_id = p.product_id;
Copy

조인에 대한 기본 키 열 이외에, 이 문은 오른쪽에 있는 dim_products 테이블의 어떤 열도 참조하지 않습니다.

dim_products.product_id 열에 PRIMARY KEY 제약 조건이 있고 fact_sales.product_id 열에 FOREIGN KEY 제약 조건이 있는 경우 Snowflake는 이 조인을 불필요한 것으로 식별하고 오른쪽에 있는 dim_products 테이블에 대한 참조를 제거할 수 있습니다.