다음을 통해 공유


참고

적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks 런타임

실행 계획을 생성하기 위한 구체적인 방법을 제안합니다.

구문

/*+ { partition_hint | join_hint | skew_hint } [, ...] */

분할 힌트

분할 힌트를 사용하면 Azure Databricks에서 따라야 하는 분할 전략을 제안할 수 있습니다. COALESCE, REPARTITIONREPARTITION_BY_RANGE 힌트가 지원되며 각각 coalesce, repartitionrepartitionByRange Dataset API와 동일합니다. 이러한 힌트는 성능을 조정하고 출력 파일 수를 제어하는 방법을 제공합니다. 여러 분할 힌트를 지정되면 여러 노드가 논리 계획에 삽입되지만 가장 왼쪽 힌트가 최적화 프로그램에서 선택됩니다.

구문

partition_hint
  COALESCE ( part_num ) |
  REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } ) |
  REPARTITION_BY_RANGE ( column_name [, ...] [, part_num] ) |
  REBALANCE [ ( column_name [, ...] ) ]

분할 힌트 형식

  • COALESCE ( part_num )

    파티션 수를 지정된 파티션 수로 줄입니다. 파티션 수를 매개 변수로 사용합니다.

  • REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } )

    지정된 분할 식을 사용하여 지정된 수의 파티션으로 다시 분할합니다. 파티션 수, 열 이름 또는 둘 다를 매개 변수로 사용합니다.

  • REPARTITION_BY_RANGE ( column_name [, ...] [, part_num]

    지정된 분할 식을 사용하여 지정된 수의 파티션으로 다시 분할합니다. 열 이름과 선택적 파티션 번호를 매개 변수로 사용합니다

  • REBALANCE [ ( column_name [, ...] ) ]

    REBALANCE 힌트는 쿼리 결과 출력 파티션의 균형을 리밸런싱하는 데 사용할 수 있으므로 모든 파티션이 적당한 크기(너무 작지도 너무 크지도 않음)가 됩니다. 열 이름을 매개 변수로 사용할 수 있으며 이러한 열로 쿼리 결과를 분할하기 위해 최선을 다합니다. 이것이 최선입니다. 기울이기가 있는 경우 Spark는 기울어진 파티션을 분할하여 이러한 파티션이 너무 크지 않도록 합니다. 이 힌트는 너무 작거나 큰 파일을 피하기 위해 이 쿼리의 결과를 테이블에 기록해야 할 때 유용합니다. AQE가 사용하도록 설정되지 않은 경우 이 힌트는 무시됩니다.

  • column_name

    다시 분할하거나 균형을 조정할 열 또는 별칭의 노출된 이름입니다.

  • part_num

    정수 리터럴입니다. 다시 분할할 파티션 수입니다.

예제

> SELECT /*+ COALESCE(3) */ * FROM t;

> SELECT /*+ REPARTITION(3) */ * FROM t;

> SELECT /*+ REPARTITION(c) */ * FROM t;

> SELECT /*+ REPARTITION(3, c) */ * FROM t;

> SELECT /*+ REPARTITION_BY_RANGE(c) */ * FROM t;

> SELECT /*+ REPARTITION_BY_RANGE(3, c) */ * FROM t;

> SELECT /*+ REBALANCE */ * FROM t;

> SELECT /*+ REBALANCE(c) */ * FROM t;

-- When a column name has been occluded by an alias you must refere to it by the alias name.
> SELECT /*+ REBALANCE(d) */ * FROM t AS s(d);

-- multiple partitioning hints
> EXPLAIN EXTENDED SELECT /*+ REPARTITION(100), COALESCE(500), REPARTITION_BY_RANGE(3, c) */ * FROM t;
== Parsed Logical Plan ==
'UnresolvedHint REPARTITION, [100]
+- 'UnresolvedHint COALESCE, [500]
   +- 'UnresolvedHint REPARTITION_BY_RANGE, [3, 'c]
      +- 'Project [*]
         +- 'UnresolvedRelation [t]

== Analyzed Logical Plan ==
name: string, c: int
Repartition 100, true
+- Repartition 500, false
   +- RepartitionByExpression [c#30 ASC NULLS FIRST], 3
      +- Project [name#29, c#30]
         +- SubqueryAlias spark_catalog.default.t
            +- Relation[name#29,c#30] parquet

== Optimized Logical Plan ==
Repartition 100, true
+- Relation[name#29,c#30] parquet

== Physical Plan ==
Exchange RoundRobinPartitioning(100), false, [id=#121]
+- *(1) ColumnarToRow
   +- FileScan parquet default.t[name#29,c#30] Batched: true, DataFilters: [], Format: Parquet,
      Location: CatalogFileIndex[file:/spark/spark-warehouse/t], PartitionFilters: [],
      PushedFilters: [], ReadSchema: struct<name:string>

조인 힌트

조인 힌트를 사용하면 Databricks SQL에서 사용해야 하는 조인 전략을 제안할 수 있습니다. 조인의 양쪽에 서로 다른 조인 전략 힌트를 지정하면 Databricks SQL에서는 힌트의 우선 순위를 BROADCAST, MERGE, SHUFFLE_HASH, SHUFFLE_REPLICATE_NL로 지정합니다. 양쪽을 BROADCAST 힌트나 SHUFFLE_HASH 힌트로 지정하면 Databricks SQL에서는 조인 형식 및 관계 크기를 기반으로 빌드 쪽을 선택합니다. 지정된 전략이 모든 조인 형식을 지원하지 않을 수 있으므로 Databricks SQL은 힌트에서 제안한 조인 전략을 사용하도록 보장되지 않습니다.

구문

join_hint
  BROADCAST ( table_name ) |
  MERGE ( table_name ) |
  SHUFFLE_HASH ( table_name ) |
  SHUFFLE_REPLICATE_NL ( table_name )

BROADCASTJOINMAPJOIN 대한 BROADCAST별칭으로 지원됩니다.

SHUFFLE_MERGEMERGEJOIN 대한 MERGE별칭으로 지원됩니다.

조인 힌트 형식

  • BROADCAST ( table_name )

    브로드캐스트 조인을 사용합니다. 힌트가 있는 조인 쪽은 autoBroadcastJoinThreshold에 관계없이 브로드캐스트됩니다. 조인의 양쪽에 브로드캐스트 힌트가 있는 경우 크기가 더 작은 쪽(통계 기준)이 브로드캐스트됩니다.

  • MERGE ( table_name )

    순서 섞기 정렬 병합 조인을 사용합니다.

  • SHUFFLE_HASH ( table_name )

    순서 섞기 해시 조인을 사용합니다. 양쪽에 순서 섞기 해시 힌트가 있는 경우 Databricks SQL은 더 작은 쪽(통계 기준)을 빌드 쪽으로 선택합니다.

  • SHUFFLE_REPLICATE_NL ( table_name )

    순서 섞기 및 복제 중첩 루프 조인을 사용합니다.

  • table_name

    힌트가 적용되는 테이블 또는 테이블 별칭의 노출된 이름입니다.

예제

-- Join Hints for broadcast join
> SELECT /*+ BROADCAST(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ BROADCASTJOIN (t1) */ * FROM t1 left JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MAPJOIN(t2) */ * FROM t1 right JOIN t2 ON t1.key = t2.key;

-- Join Hints for shuffle sort merge join
> SELECT /*+ SHUFFLE_MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MERGEJOIN(t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- Join Hints for shuffle hash join
> SELECT /*+ SHUFFLE_HASH(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- Join Hints for shuffle-and-replicate nested loop join
> SELECT /*+ SHUFFLE_REPLICATE_NL(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- When different join strategy hints are specified on both sides of a join, Databricks SQL
-- prioritizes the BROADCAST hint over the MERGE hint over the SHUFFLE_HASH hint
-- over the SHUFFLE_REPLICATE_NL hint.
-- Databricks SQL will issue Warning in the following example
-- org.apache.spark.sql.catalyst.analysis.HintErrorLogger: Hint (strategy=merge)
-- is overridden by another hint and will not take effect.
> SELECT /*+ BROADCAST(t1), MERGE(t1, t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- When a table name is occluded by an alias you must use the alias name in the hint
> SELECT /*+ BROADCAST(t1), MERGE(s1, s2) */ * FROM t1 AS s1 INNER JOIN t2 AS s2 ON s1.key = s2.key;

기울이기 힌트

(Delta Lake) 힌트에 대한 자세한 내용은 기울이기 힌트를 사용하여 기울이기 조인 최적화를 SKEW 참조하세요.