기울이기 힌트를 사용한 기울이기 조인 최적화
Important
이 설명서는 사용 중지되었으며 업데이트되지 않을 수 있습니다. 이 콘텐츠에 언급된 제품, 서비스 또는 기술은 더 이상 지원되지 않습니다.
기울이기 조인 힌트는 필요하지 않습니다. Databricks는 기본적으로 AQE(적응 쿼리 실행)를 사용하여 기울이기를 처리합니다. 적응형 쿼리 실행을 참조하세요.
참고 항목
spark.sql.adaptive.skewJoin.enabled
True
는 Azure Databricks의 기본 설정인 여야 합니다.
데이터 기울이기란?
데이터 기울이기는 테이블의 데이터가 클러스터의 파티션 간에 고르지 않게 분산되는 상태입니다. 데이터 기울이기는 쿼리, 특히 조인이 있는 쿼리의 성능을 심각하게 저하시킬 수 있습니다. 큰 테이블 간의 조인에는 데이터 셔플링이 필요하며 비대칭은 클러스터에서 작업의 극심한 불균형으로 이어질 수 있습니다. 쿼리가 매우 적은 작업(예: 200개 작업 중 마지막 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