Wskazówki

Dotyczy:check marked yes Databricks SQL check marked yes Databricks Runtime

Zasugeruj konkretne podejścia do generowania planu wykonania.

Składnia

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

Wskazówki dotyczące partycjonowania

Wskazówki dotyczące partycjonowania umożliwiają sugerowanie strategii partycjonowania, która powinna być zgodna z usługą Azure Databricks. COALESCEREPARTITIONObsługiwane są wskazówki , i REPARTITION_BY_RANGE są równoważne coalesceodpowiednio interfejsom API , repartitioni repartitionByRange zestawów danych. Te wskazówki umożliwiają dostosowanie wydajności i kontrolowania liczby plików wyjściowych. W przypadku określenia wielu wskazówek partycjonowania wiele węzłów jest wstawionych do planu logicznego, ale najbardziej lewa wskazówka jest wybierana przez optymalizator.

Składnia

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

Typy wskazówek dotyczących partycjonowania

  • COALESCE ( part_num )

    Zmniejsz liczbę partycji do określonej liczby partycji. Przyjmuje numer partycji jako parametr.

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

    Ponowne partycjonowanie do określonej liczby partycji przy użyciu określonych wyrażeń partycjonowania. Przyjmuje numer partycji, nazwy kolumn lub oba parametry.

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

    Ponowne partycjonowanie do określonej liczby partycji przy użyciu określonych wyrażeń partycjonowania. Przyjmuje nazwy kolumn i opcjonalny numer partycji jako parametry.

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

    Wskazówka REBALANCE może służyć do ponownego równoważenia partycji wyjściowych wyników zapytania, dzięki czemu każda partycja ma rozsądny rozmiar (nie jest zbyt mały i nie zbyt duży). Może ona przyjmować nazwy kolumn jako parametry i jak najlepiej partycjonować wyniki zapytania według tych kolumn. Jest to najlepsze rozwiązanie: jeśli istnieją niesymetryczności, platforma Spark podzieli niesymetryczne partycje, aby te partycje nie były zbyt duże. Ta wskazówka jest przydatna, gdy trzeba napisać wynik tego zapytania do tabeli, aby uniknąć zbyt małych/dużych plików. Ta wskazówka jest ignorowana, jeśli usługa AQE nie jest włączona.

  • Column_name

    Uwidoczniona nazwa kolumny lub aliasu do ponownego partycjonowania lub ponownego równoważenia według.

  • part_num

    Literał liczby całkowitej. Liczba partycji do ponownego partycjonowania.

Przykłady

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

Wskazówki dotyczące sprzężenia

Wskazówki dotyczące dołączania umożliwiają sugerowanie strategii sprzężenia, której należy użyć w usłudze Sql usługi Databricks. Gdy różne wskazówki dotyczące strategii sprzężenia są określone po obu stronach sprzężenia, usługa Databricks SQL określa priorytety wskazówek w następującej kolejności: BROADCAST ponad SHUFFLE_HASHMERGESHUFFLE_REPLICATE_NL. Gdy obie strony są określone z BROADCAST wskazówką lub SHUFFLE_HASH wskazówką, usługa SQL usługi Databricks wybiera stronę kompilacji na podstawie typu sprzężenia i rozmiarów relacji. Ponieważ dana strategia może nie obsługiwać wszystkich typów sprzężeń, usługa Databricks SQL nie ma gwarancji, że użyj strategii sprzężenia sugerowanej przez wskazówkę.

Składnia

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

BROADCASTJOINi MAPJOIN są obsługiwane jako aliasy dla .BROADCAST

SHUFFLE_MERGEi MERGEJOIN są obsługiwane jako aliasy dla .MERGE

Typy wskazówek sprzężenia

  • BROADCAST ( table_name )

    Użyj sprzężenia emisji. Strona sprzężenia z wskazówką jest emitowana niezależnie od autoBroadcastJoinThreshold. Jeśli obie strony sprzężenia mają wskazówki emisji, jest emitowany ten o mniejszym rozmiarze (na podstawie statystyk).

  • MERGE ( table_name )

    Użyj sprzężenia scalania sortowania shuffle.

  • SHUFFLE_HASH ( table_name )

    Użyj sprzężenia skrótu shuffle. Jeśli obie strony mają wskazówki dotyczące skrótu mieszania, usługa Sql usługi Databricks wybiera mniejszą stronę (na podstawie statystyk) jako stronę kompilacji.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Użyj sprzężenia zagnieżdżonej pętli shuffle-and-replicate.

  • Nazwa_tabeli

    Uwidoczniona nazwa tabeli lub aliasu tabeli, do którego ma zastosowanie wskazówka.

Przykłady

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

Wskazówki niesymetryczne

(Delta Lake) Aby uzyskać informacje na temat wskazówki na temat wskazówki dotyczące sprzężenia niesymetrycznego, zobacz Optymalizacja sprzężenia niesymetrycznegoSKEW.