Bagikan melalui


Pengoptimalan gabungan condong menggunakan petunjuk condong

Penting

Dokumentasi ini telah dihentikan dan mungkin tidak diperbarui. Produk, layanan, atau teknologi yang disebutkan dalam konten ini tidak lagi didukung.

Petunjuk gabungan condong tidak diperlukan. Databricks menangani penyimpangan secara default dengan menggunakan eksekusi kueri adaptif (AQE). Lihat Eksekusi kueri adaptif.

Catatan

spark.sql.adaptive.skewJoin.enabled harus True, yang merupakan pengaturan default pada Azure Databricks.

Apa itu kemiringan data?

Data skew adalah suatu kondisi saat data tabel didistribusikan secara tidak merata di antara partisi dalam kluster. Data skew dapat sangat menurunkan performa kueri, terutama dengan gabung. Gabung antara tabel besar membutuhkan pengacakan data dan skew dapat menyebabkan ketidakseimbangan pekerjaan yang ekstrem dalam kluster. Kemungkinan data skew memengaruhi kueri jika kueri tampaknya macet menyelesaikan sangat sedikit tugas (misalnya, 3 tugas terakhir dari 200). Untuk memverifikasi bahwa data skew memengaruhi kueri:

  1. Klik tahap yang macet dan verifikasi bahwa itu adalah gabung.
  2. Setelah kueri selesai, temukan tahap yang melakukan gabung dan periksa distribusi durasi tugas.
  3. Urutkan tugas dengan mengurangi durasi dan periksa beberapa tugas pertama. Jika satu tugas membutuhkan waktu lebih lama untuk diselesaikan daripada tugas lainnya, ada skew.

Untuk memperbaiki kemiringan, Delta Lake di Azure Databricks SQL menerima petunjuk skew dalam kueri. Dengan informasi dari petunjuk skew, Databricks Runtime dapat membuat rencana kueri yang lebih baik, yang tidak mengalami data skew.

Mengonfigurasi petunjuk skew dengan nama relasi

Petunjuk skew harus berisi setidaknya nama hubungan dengan condong. Relasi adalah tabel, tampilan, atau kueri bertumpuk. Semua gabung dengan relasi ini kemudian gunakan optimalisasi skew join.

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

Mengonfigurasi petunjuk skew dengan nama relasi dan nama kolom

Mungkin ada beberapa gabung pada suatu hubungan dan hanya beberapa darinya yang akan mengalami skew. Optimalisasi skew join memiliki beberapa overhead sehingga lebih baik menggunakannya hanya bila diperlukan. Untuk tujuan ini, petunjuk skew menerima nama kolom. Hanya gabung dengan kolom ini menggunakan optimalisasi skew join.

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

Mengonfigurasi petunjuk skew dengan nama relasi, nama kolom, dan nilai skew

Anda juga dapat menentukan nilai skew dalam petunjuk. Bergantung pada kueri dan data, nilai miring mungkin diketahui (misalnya, karena tidak pernah berubah) atau mungkin mudah diketahui. Melakukan hal ini mengurangi overhead optimalisasi skew join. Jika tidak, Delta Lake mendeteksinya secara otomatis.

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