Wskazówki
Dotyczy: Databricks SQL
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 pozwalają zasugerować strategię partycjonowania, której Azure Databricks powinno się trzymać.
COALESCE
, REPARTITION
i REPARTITION_BY_RANGE
to obsługiwane wskazówki, które są równoważne odpowiednio interfejsom API coalesce
, repartition
i 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 na określoną liczbę partycji, korzystając z 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.-
Widoczna nazwa kolumny lub aliasu do ponownego partycjonowania lub równoważenia.
part_num
Literał liczby całkowitej. Liczba partycji, do których ma nastąpić ponowne partycjonowanie.
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
Podpowiedzi dotyczące łączenia umożliwiają zasugerowanie strategii łączenia, której powinien użyć Databricks SQL.
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 MERGE
ponad SHUFFLE_HASH
ponad SHUFFLE_REPLICATE_NL
.
Gdy obie strony są określone za pomocą wskazówki BROADCAST
lub SHUFFLE_HASH
, Databricks SQL wybiera stronę do budowy na podstawie typu sprzężenia i rozmiarów relacji.
Ponieważ dana strategia może nie obsługiwać wszystkich typów sprzężeń, w usłudze Databricks SQL nie ma gwarancji użycia strategii sprzężeń sugerowanej przez wskazówkę.
Składnia
join_hint
BROADCAST ( table_name ) |
MERGE ( table_name ) |
SHUFFLE_HASH ( table_name ) |
SHUFFLE_REPLICATE_NL ( table_name )
BROADCASTJOIN
i MAPJOIN
są obsługiwane jako aliasy dla .BROADCAST
SHUFFLE_MERGE
i MERGEJOIN
są obsługiwane jako aliasy dla .MERGE
Typy wskazówek sprzężenia
BROADCAST ( table_name )
Użyj łączenia typu broadcast. Strona sprzężenia ze wskazówką jest transmitowana 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, Databricks SQL wybiera mniejszą stronę (na podstawie statystyk) jako stronę konstrukcyjną.
SHUFFLE_REPLICATE_NL ( table_name )
Użyj sprzężenia zagnieżdżonej pętli typu shuffle-and-replicate.
-
Uwidoczniona nazwa tabeli lub aliasu tabeli, do którego stosuje się podpowiedź.
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 dotyczącej sprzężenia niesymetrycznego, zobacz Optymalizacja sprzężenia niesymetrycznego za pomocą wskazówekSKEW
.