JOIN iyileştirmesini eğriltme

Veri eğriltme, bir tablo verilerinin kümedeki bölümler arasında eşit olarak dağıtılmadığını belirten bir durumdur. Veri eğriltme, özellikle birleştirmelere sahip olan sorguların performansını ciddi ölçüde indirgeyebilirler. Büyük tablolar arasındaki birleşimler, verileri karıştırmaya gerek duyar ve bu, eğriliği kümede çok fazla iş dengelemeye yol açabilir. Bir sorgu çok az sayıda görevi (örneğin, 200 'den son 3 görevi) bitirmek gibi görünüyorsa veri eğliği bir sorguyu etkiliyor olabilir. Veri eğiğini bir sorguyu etkilediğini doğrulamak için:

  1. Takılı olan aşamaya tıklayın ve bir JOIN işlemi yaptığını doğrulayın.
  2. Sorgu bittikten sonra, bir JOIN ve görev süresi dağılımını kontrol eden aşamayı bulun.
  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, eğriliği vardır.

Ameliorate eğliği için Azure Databricks SQL üzerinde Delta Gölü, sorgularda eğriltme ipuçlarını kabul eder. Eğme ipucundaki bilgilerle Databricks Runtime, veri eğipden dolayı daha iyi bir sorgu planı oluşturabilir.

Eğim ipucunu ilişki adıyla yapılandırma

Eğme ipucu, çarpıklık ile en az bir ilişki adı içermelidir. Bir ilişki tablo, görünüm veya alt sorgu olur. Bu ilişkiye sahip tüm birleşimler, birleştirme iyileştirmesini eğriltme 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

Eğim ipucunu ilişki adı ve sütun adlarıyla yapılandırma

Bir ilişkide birden fazla birleşim olabilir ve bunlardan yalnızca bazıları eğriltiden zarar verebilir. Katılımın en iyi duruma getirilmesi, yalnızca gerektiğinde kullanılması daha fazla yüke neden olur. Bu amaçla, eğriltme ipucu sütun adlarını kabul eder. Yalnızca bu sütunlara olan birleşimler, eğriltme JOIN 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

Eğim ipucunu ilişki adı, sütun adları ve eğriltme değerleriyle yapılandırma

İpucu içindeki eğme değerlerini de belirtebilirsiniz. Sorgu ve verilere bağlı olarak, eğriltme değerleri bilinebilir (örneğin, hiç değişmediği için) veya kolayca bulunabilir. Bunu yapmak, JOIN iyileştirmesini eğriltme yükünü azaltır. Aksi halde, Delta Gölü onları 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