Eğme ipuçlarını kullanarak eğme birleştirme iyileştirmesi

Bu makalede, sorgu performansını düşürebilen bir koşul olan tablodaki veri dengesizliklerini hafifletmek için eğme ipuçlarının nasıl kullanılacağı açıklanmaktadır.

Dekont

Eğme birleştirme ipuçları gerekli değildir. Uyarlamalı sorgu yürütme (AQE) ve spark.sql.adaptive.skewJoin.enabled her ikisi de etkinse eğme işlemi otomatik olarak yapılır. Bkz. Uyarlamalı sorgu yürütme.

Veri dengesizliği nedir?

Veri dengesizliği, bir tablonun verilerinin kümedeki bölümler arasında eşit olmayan bir şekilde dağıtıldığı bir koşuldur. Veri dengesizliği, özellikle birleştirmeleri olan sorguların performansını ciddi ölçüde düşürebilir. Büyük tablolar arasındaki birleştirmeler verilerin karıştırılmasını gerektirir ve dengesizlik kümede aşırı bir iş dengesizliği oluşmasına neden olabilir. Bir sorgu çok az görevi (örneğin, 200'ün son 3 görevi) tamamlarken takılmış gibi görünüyorsa, büyük olasılıkla veri dengesizliği sorguyu etkiliyordur. Veri dengesizliğinin sorguyu etkilediğini doğrulamak için:

  1. Takılan aşamaya tıklayın ve birleştirme yaptığını doğrulayın.
  2. Sorgu tamamlandıktan sonra, birleştirme işlemi yapılan aşamayı bulun ve görev süresi dağılımını denetleyin.
  3. Süreyi azaltarak görevleri sıralayın ve ilk birkaç görevi denetleyin. Bir görevin tamamlanması diğer görevlerden çok daha uzun sürerse, dengesizlik olur.

Dengesizliği hafifletmek için Azure Databricks SQL üzerinde Delta Lake sorgularda dengesizlik ipuçlarını kabul eder. Bir dengesizlik ipucundan alınan bilgilerle Databricks Runtime, veri dengesizliği yaşamayan daha iyi bir sorgu planı oluşturabilir.

İlişki adıyla eğme ipucunu yapılandırma

Eğme ipucu en azından eğriltme ile ilişkinin adını içermelidir. İlişki bir tablo, görünüm veya alt sorgudur. Bu ilişkiyle tüm birleşimler, sonra eğme birleştirme iyileştirmesini kullanır.

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

İlişki adı ve sütun adlarıyla eğme ipucunu yapılandırma

Bir ilişkide birden çok birleşim olabilir ve yalnızca bazıları dengesizlik yaşayabilir. Eğme birleştirme iyileştirmesi bazı ek yüklere sahiptir, bu nedenle yalnızca gerektiğinde kullanmak daha iyidir. Bu amaçla, eğme ipucu sütun adlarını kabul eder. Yalnızca bu sütunlara sahip birleşimler eğme birleştirme iyileştirmesini kullanır.

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

İlişki adı, sütun adları ve eğriltme değerleriyle eğme ipucunu yapılandırma

İpucunda eğme değerlerini de belirtebilirsiniz. Sorguya ve verilere bağlı olarak, eğme değerleri bilinebilir (örneğin, hiç değişmedikleri için) veya kolayca öğrenilebilir. Bunu yapmak, eğriltme birleştirme iyileştirmesi yükünü azaltır. Aksi takdirde Delta Lake bunları otomatik olarak algılar.

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