다음을 통해 공유


기울이기 힌트를 사용한 기울이기 조인 최적화

Important

이 설명서는 사용 중지되었으며 업데이트되지 않을 수 있습니다. 이 콘텐츠에 언급된 제품, 서비스 또는 기술은 더 이상 지원되지 않습니다.

기울이기 조인 힌트는 필요하지 않습니다. Databricks는 기본적으로 AQE(적응 쿼리 실행)를 사용하여 기울이기를 처리합니다. 적응형 쿼리 실행을 참조하세요.

참고 항목

spark.sql.adaptive.skewJoin.enabledTrue는 Azure Databricks의 기본 설정인 여야 합니다.

데이터 기울이기란?

데이터 기울이기는 테이블의 데이터가 클러스터의 파티션 간에 고르지 않게 분산되는 상태입니다. 데이터 기울이기는 쿼리, 특히 조인이 있는 쿼리의 성능을 심각하게 저하시킬 수 있습니다. 큰 테이블 간의 조인에는 데이터 셔플링이 필요하며 비대칭은 클러스터에서 작업의 극심한 불균형으로 이어질 수 있습니다. 쿼리가 매우 적은 작업(예: 200개 작업 중 마지막 3개 작업)을 끝내지 못하는 것처럼 보이는 경우 데이터 기울이기가 쿼리에 영향을 주고 있을 수 있습니다. 데이터 기울이기가 쿼리에 영향을 미치는지 확인하려면:

  1. 멈춘 스테이지를 클릭하고 조인을 하고 있는지 확인합니다.
  2. 쿼리가 끝난 후 조인을 하는 단계를 찾아 작업 기간 분포를 확인한다.
  3. 기간을 줄여 작업을 정렬하고 처음 몇 개의 작업을 확인합니다. 한 작업이 다른 작업보다 완료하는 데 훨씬 오래 걸리면 기울이기가 있는 것입니다.

기울이기를 개선하기 위해 Azure Databricks SQL의 Delta Lake는 쿼리에서 기울이기 힌트를 허용합니다. 기울이기 힌트의 정보를 사용하여 Databricks Runtime은 데이터 기울이기가 없는 더 나은 쿼리 계획을 구성할 수 있습니다.

관계 이름으로 기울이기 힌트 구성

기울이기 힌트는 적어도 기울이기가 있는 관계의 이름은 포함하고 있어야 합니다. 관계는 테이블, 뷰 또는 하위 쿼리입니다. 이 관계가 있는 모든 조인은 기울이기 조인 최적화를 사용합니다.

-- table with skew
SELECT /*+ SKEW('orders') */
  *
  FROM orders, customers
  WHERE c_custId = o_custId

-- subquery with skew
SELECT /*+ SKEW('C1') */
  *
  FROM (SELECT * FROM customers WHERE c_custId < 100) C1, orders
  WHERE C1.c_custId = o_custId

관계 이름 및 열 이름으로 기울이기 힌트 구성

한 관계에 여러 조인이 있을 수 있으며 그중 일부만 기울이기로 인해 어려움을 겪을 수 있습니다. 기울이기 조인 최적화는 약간의 오버헤드가 있으므로 필요할 때만 사용하는 것이 좋습니다. 이를 위해 기울이기 힌트는 열 이름을 허용합니다. 이러한 열이 있는 조인만 기울이기 조인 최적화를 사용합니다.

-- single column
SELECT /*+ SKEW('orders', 'o_custId') */
  *
  FROM orders, customers
  WHERE o_custId = c_custId

-- multiple columns
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId')) */
  *
  FROM orders, customers
  WHERE o_custId = c_custId AND o_storeRegionId = c_regionId

관계 이름, 열 이름 및 기울이기 값으로 기울이기 힌트 구성

힌트에서 기울이기 값을 지정할 수도 있습니다. 쿼리 및 데이터에 따라 기울이기 값이 알려지거나(예: 절대 변경되지 않기 때문에) 쉽게 찾을 수 있습니다. 이렇게 하면 기울이기 조인 최적화의 오버헤드가 줄어듭니다. 그렇지 않으면 Delta Lake가 자동으로 검색합니다.

-- single column, single skew value
SELECT /*+ SKEW('orders', 'o_custId', 0) */
  *
  FROM orders, customers
  WHERE o_custId = c_custId

-- single column, multiple skew values
SELECT /*+ SKEW('orders', 'o_custId', (0, 1, 2)) */
  *
  FROM orders, customers
  WHERE o_custId = c_custId

-- multiple columns, multiple skew values
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId'), ((0, 1001), (1, 1002))) */
  *
  FROM orders, customers
  WHERE o_custId = c_custId AND o_storeRegionId = c_regionId