Optimierung der Verzerrungs Optimierung Skew Join optimization

Daten Schiefe ist eine Bedingung, bei der die Daten einer Tabelle nicht gleichmäßig auf die Partitionen im Cluster verteilt sind.Data skew is a condition in which a table’s data is unevenly distributed among partitions in the cluster. Die Daten Schiefe kann die Leistung von Abfragen erheblich herabstufen, insbesondere solche mit Joins.Data skew can severely downgrade performance of queries, especially those with joins. Joins zwischen großen Tabellen erfordern das herunter setzen von Daten, und die Schiefe kann zu einem extrem großen Ungleichheits Ungleichheits Verhältnis im Cluster führen.Joins between big tables require shuffling data and the skew can lead to an extreme imbalance of work in the cluster. Es ist wahrscheinlich, dass sich die Daten Schiefe auf eine Abfrage auswirkt, wenn eine Abfrage mit einigen wenigen Aufgaben hängen bleibt (z. b. die letzten drei Aufgaben von 200).It’s likely that data skew is affecting a query if a query appears to be stuck finishing very few tasks (for example, the last 3 tasks out of 200). So überprüfen Sie dies:To verify:

  1. Klicken Sie auf die gesteckte Phase, und vergewissern Sie sich, dass ein Join ausgeführt wird.Click the stage that is stuck and verify that it is doing a join.
  2. Nachdem die Abfrage abgeschlossen ist, suchen Sie die Phase, die einen Join durchführt, und überprüfen Sie die Verteilung der Aufgabendauer.After the query finishes, find the stage that does a join and check the task duration distribution.
  3. Sortieren Sie die Aufgaben nach absteigender Dauer, und überprüfen Sie die ersten Tasks.Sort the tasks by decreasing duration and check the first few tasks. Wenn eine Aufgabe viel länger dauert als die anderen Aufgaben, gibt es eine schiefe.If one task took much longer to complete than the other tasks, there is skew.

Um die Schiefe zu verbessern, nimmt Delta Lake on Azure Databricks SQL schiefe Hinweise in Abfragen an.To ameliorate skew, Delta Lake on Azure Databricks SQL accepts skew hints in queries. Mit den Informationen aus diesen hinweisen kann Spark einen besseren Abfrageplan erstellen, der von der Daten Schiefe nicht beeinträchtigt wird.With the information from these hints, Spark can construct a better query plan, one that does not suffer from data skew.

Nur Beziehungs NameOnly relation name

Ein schiefe-Hinweis muss mindestens den Namen der Beziehung mit Schiefe enthalten.A skew hint must contain at least the name of the relation with skew. Eine Beziehung ist eine Tabelle, eine Sicht oder eine Unterabfrage.A relation is a table, view, or a subquery. Alle Joins mit dieser Beziehung verwenden dann die Optimierungs Optimierungs Optimierung.All joins with this relation then use skew join optimization.

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

Beziehung und SpaltenRelation and columns

Möglicherweise gibt es mehrere Joins in Bezug auf eine Beziehung, und nur einige davon werden von der Schiefe beeinträchtigt.There might be multiple joins on a relation and only some of them will suffer from skew. Die Optimierung der Verzerrungs Verknüpfung hat einen gewissen Aufwand, sodass es besser ist, Sie nur bei Bedarf zu verwenden.Skew join optimization has some overhead so it is better to use it only when needed. Zu diesem Zweck nimmt der schiefe-Hinweis Spaltennamen an.For this purpose, the skew hint accepts column names. Nur Verknüpfungen mit diesen Spalten verwenden die Optimierungs Optimierungs Optimierung.Only joins with these columns use skew join optimization.

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

Werte für Beziehung, Spalten und SchiefeRelation, columns, and skew values

Sie können im Hinweis auch Schiefe Werte angeben.You can also specify skew values in the hint. Abhängig von der Abfrage und den Daten sind möglicherweise die Schiefe Werte bekannt (z. b. weil Sie sich nie ändern) oder leicht zu finden. Auf diese Weise wird der mehr Aufwand der Optimierungs Optimierungs Optimierung reduziert.Depending on the query and data, the skew values might be known (for example, because they never change) or might be easy to find out. Doing this reduces the overhead of skew join optimization. Andernfalls erkennt Delta Lake diese automatisch.Otherwise, Delta Lake detects them automatically.

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