다음을 통해 공유


스큐 힌트를 사용한 스큐 조인 최적화

중요하다

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

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

메모

spark.sql.adaptive.skewJoin.enabled은 Azure Databricks의 기본 설정인 True이어야 합니다.

데이터 왜곡이란?

데이터 기울이기는 테이블의 데이터가 클러스터의 파티션 간에 고르지 않게 분산되는 조건입니다. 데이터 오차는 쿼리의 성능, 특히 조인이 있는 쿼리의 성능을 심각하게 다운그레이드할 수 있습니다. 큰 테이블 간의 조인에는 데이터 셔플링이 필요하며, 데이터 skew로 인해 클러스터의 작업에 극심한 불균형이 발생할 수 있습니다. 쿼리가 거의 완료되지 않고 있는 것처럼 보일 경우(예: 200개 작업 중 마지막 3개 작업) 데이터 왜곡이 쿼리에 영향을 미칠 가능성이 있습니다. 데이터 기울이기가 쿼리에 영향을 미치는지 확인하려면 다음을 수행합니다.

  1. 중단된 단계를 클릭하고 조인을 수행하고 있는지 확인합니다.
  2. 쿼리가 완료되면 조인을 수행하는 단계를 찾아 작업 기간 분포를 확인합니다.
  3. 기간을 줄여 작업을 정렬하고 처음 몇 가지 작업을 확인합니다. 한 작업이 다른 작업들보다 완료하는 데 훨씬 더 오래 걸렸다면 편차가 있습니다.

기울어짐을 개선하기 위해 Azure Databricks SQL의 Delta Lake는 쿼리에서 skew 힌트을 허용합니다. 편향 힌트의 정보를 사용하여 Databricks 런타임은 데이터 편향의 영향을 받지 않는 더 효율적인 쿼리 계획을 생성할 수 있습니다.

관계 이름과 함께 기울임 힌트 구성

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

-- 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