Tüm Ürünler
Search
Belge Merkezi

MaxCompute:SKEWJOIN HINT

Son Güncelleme:Oct 04, 2026

Bir JOIN işlemi, sık kullanılan anahtar değerleri nedeniyle yavaş çalışıyorsa bu anahtarları izole ederek verimliliği artırabilirsiniz. SKEWJOIN HINT, verileri sık kullanılan anahtar değerlerini içeren kısım ve kalan veri olarak iki bölüme ayırır; her bölümü ayrı ayrı işler ve sonuçları birleştirir. Bu hint, sık kullanılan anahtar değerlerini otomatik olarak tespit edebilir veya manuel olarak belirtmenize olanak tanıyarak birleştirme işlemini hızlandırır.

Kullanım

Bu özelliği kullanmak için select ifadenize /*+ skewJoin(<table_name>[(<column1_name>[,<column2_name>,...])][((<value11>,<value12>)[,(<value21>,<value22>)...])]*/ biçiminde SKEWJOIN HINT ekleyin. Hint içinde table_name eğik dağılıma sahip tabloyu, column_name eğik dağılıma sahip sütunu ve value eğik dağılıma neden olan anahtar değerini belirtir.

-- Method 1: Specify the table name (note that you must hint the table alias).
select /*+ skewjoin(a) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1;
-- Method 2: Specify the table and the columns that you suspect are skewed. For example, columns c0 and c1 in table 'a' are skewed.
select /*+ skewjoin(a(c0, c1)) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1 and a.c2 = b.c2;
-- Method 3: Specify the table, columns, and the exact skewed key values. If a value is a STRING type, enclose it in double quotation marks. For example, the values in (a.c0=1 and a.c1="2") and (a.c0=3 and a.c1="4") cause data skew.
select /*+ skewjoin(a(c0, c1)((1, "2"), (3, "4"))) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1 and a.c2 = b.c2;
Not

Eğik dağılıma neden olan anahtar değerlerini açıkça belirttiğiniz Yöntem 3, Yöntem 1 ve Yöntem 2'den daha verimlidir.

Çalışma Prensibi

Sık kullanılan anahtar değeri, çok yüksek sıklıkta görünen bir anahtardır. Örneğin aşağıdaki şekilde kırmızı bölüm, a.c0=1 and a.c1=2 koşulunu sağlayan 10.000 satırı ve a.c0=3 and a.c1 = 4 koşulunu sağlayan 9.000 satırı göstermektedir.热值key

SKEWJOIN HINT kullanılmadığında büyük T0 ve T1 tablolarını birleştirmek için MERGE JOIN gerekir. Bu süreçte aynı sık kullanılan anahtar değerlerinin tümü tek bir düğüme gönderilir ve bu durum veri eğikliğine neden olur. SKEWJOIN HINT eklendiğinde iyileştirici bir toplama işlemi çalıştırarak sıklığa göre en sık kullanılan 20 anahtar değerini dinamik olarak belirler. Ardından T0 tablosunu iki veri kümesine ayırır: biri sık kullanılan anahtar değerlerini içeren (Veri A), diğeri kalan değerleri içeren (Veri B). Benzer şekilde T1 tablosunu da T0'daki sık kullanılan anahtar değerleriyle eşleşen satırlar (Veri C) ve kalan satırlar (Veri D) olarak ikiye böler. Sonraki adımda Veri A ve Veri C üzerinde MAP JOIN uygular. Veri C veri kümesi küçük olduğundan MAP JOIN verimli çalışır. Daha sonra Veri B ve Veri D üzerinde MERGE JOIN uygular. En sonunda aşağıdaki şekilde gösterildiği gibi MAP JOIN ve MERGE JOIN sonuçlarını UNION ALL işlemiyle birleştirerek nihai sonucu üretir.SkewJoin Hint

Notlar

  • SKEWJOIN HINT aşağıdaki JOIN türlerini destekler:

    • INNER JOIN: Hint'i birleştirmedeki herhangi bir tabloya uygulayabilirsiniz.

    • LEFT JOIN, SEMI JOIN ve ANTI JOIN: Hint'i yalnızca sol tabloya uygulayabilirsiniz.

    • RIGHT JOIN: Hint'i yalnızca sağ tabloya uygulayabilirsiniz.

    • FULL JOIN: Bu birleştirme türü desteklenmez.

  • Hint'i yalnızca veri eğikliğine neden olacağını bildiğiniz birleştirmelere ekleyin. Hint, bir toplama işlemi başlatır ve bu durum belirli bir ek yük getirir. Ayrıca A JOIN B gibi bir sorguda A tablosuna SKEWJOIN HINT eklemek, MAP JOIN UNION ALL MERGE JOIN benzeri bir fiziksel yürütme planı zorlar. MAP JOIN alt planı, Top 20(A) MAP JOIN (B SEMI JOIN Top20(A)) benzeri bir plana genişler. B tablosu büyükse ve B tablosundan filtrelenen sonuç hâlâ büyükse, hash tablosu oluşturulurken MAP JOIN işlemi bellek yetersizliği (OOM) hatasına neden olabilir.

  • Hint eklenen birleştirmede sol ve sağ taraftaki birleştirme anahtarlarının veri türleri eşleşmelidir. Aksi takdirde SKEWJOIN HINT etkisiz kalır. Veri türü tutarlılığını sağlamak için aşağıdaki örneklerde gösterildiği gibi bir alt sorgu içinde CAST işlevini kullanabilirsiniz:

    create table T0(c0 int, c1 int, c2 int, c3 int);
    create table T1(c0 string, c1 int, c2 int);
    --Method 1:
    select /*+ skewjoin(a) */ * from T0 a join T1 b on cast(a.c0 as string) = cast(b.c0 as string) and a.c1 = b.c1;
    --Method 2:
    select /*+ skewjoin(b) */ * from (select cast(a.c0 as string) as c00 from T0 a) b join T1 c on b.c00 = c.c0;
  • SKEWJOIN HINT ekledikten sonra iyileştirici, en sık kullanılan 20 anahtar değerini belirlemek için bir toplama işlemi çalıştırır. 20 değeri varsayılandır. Bu varsayılanı değiştirmek için set odps.optimizer.skew.join.topk.num = xx; komutunu çalıştırın.

  • SKEWJOIN HINT'i bir birleştirmede yalnızca bir tabloya uygulayabilirsiniz.

  • Hint eklenen birleştirme, left key = right key koşulunu içeren bir eşitlik birleştirmesi olmalıdır. CARTESIAN JOIN işlemleri desteklenmez.

  • Aşağıdaki örnekte gösterildiği gibi SKEWJOIN HINT'i diğer hint'lerle birlikte kullanabilirsiniz. Ancak MAP JOIN hint'i zaten içeren bir birleştirmeye SKEWJOIN HINT ekleyemezsiniz.

    select /*+ mapjoin(c), skewjoin(a) */ * from T0 a join T1 b on a.c0 = b.c3 join T2 c on a.c0 = c.c7;
  • Logview'in Json Summary sekmesinde topk_agg alanını arayarak SKEWJOIN HINT'in etkin olduğunu doğrulayın.