Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Optimizer

Son Güncelleme:Oct 04, 2026

MaxCompute optimizer maliyet tabanlıdır. Satır sayısı ve ortalama dize uzunluğu gibi meta verileri kullanarak maliyetleri doğru şekilde tahmin eder. Bu konuda, sorgu performansını optimize etmek için MaxCompute'te meta verilerin nasıl toplanacağı açıklanmaktadır.

Arka plan bilgileri

Doğru meta veriler olmadan optimizer, maliyetleri yanlış hesaplayabilir ve verimsiz çalıştırma planları oluşturabilir. Bu nedenle meta veriler optimizer için hayati önem taşır. Tablo meta verileri öncelikle sütun istatistiklerinden (Column stats) oluşur. Diğer meta verileri hesaplamak için bu istatistikler kullanılır.

MaxCompute istatistik toplamak için iki yöntem sunar:

  • Eşzamansız toplama çerçevesi (Analyze): analyze komutunu kullanarak istatistikleri eşzamansız olarak toplayabilirsiniz. Bu yöntemi manuel olarak başlatmanız gerekir.

    Not

    MaxCompute istemcisi sürümünün 0,35 veya üzeri olması gerekir.

  • Eşzamanlı toplama çerçevesi (Freeride): Bu yöntem, veriler oluşturulurken sütun istatistiklerini otomatik olarak toplar. Daha otomatiktir ancak sorgu gecikme süresini etkileyebilir.

MaxCompute, farklı veri türleri için aşağıdaki sütun istatistiği ölçümlerini toplar.


Sütun istatistiği ölçümü/Veri türü


Sayısal türler (TINYINT, SMALLINT, INT, BIGINT, DOUBLE, DECIMAL, NUMERIC)


Karakter türleri (STRING, VARCHAR, CHAR)


İkili tür (BINARY)


Boole türü (BOOLEAN)


Tarih türleri (TIMESTAMP, DATE, INTERVAL)


Karmaşık türler (MAP, STRUCT, ARRAY)


min (minimum)


E


H


H


H


E


H


max (maksimum)


E


H


H


H


E


H


nNulls (null sayısı)


E


E


E


E


E


E


avgColLen (ortalama sütun uzunluğu)


H


E


E


H


H


H


maxColLen (maksimum sütun uzunluğu)


H


E


E


H


H


H


ndv (farklı değer sayısı)


E


E


E


E


E


H


topK (en sık görülen ilk K değer)


E


E


E


E


E


H

Not

E, ölçümün desteklendiğini gösterir. H, ölçümün desteklenmediğini gösterir.

Senaryolar

Aşağıdaki tabloda her sütun istatistiği ölçümü için senaryolar açıklanmaktadır.

Sütun istatistiği ölçümü

Özellik

Senaryo

Açıklama

min (minimum) veya max (maksimum)

Optimizasyon doğruluğunu artırmak için minimum veya maksimum değeri elde eder.

Senaryo 1: Çıktı kayıt sayısını tahmin etme.

Yalnızca veri türü sağlanırsa değer aralığı geniş olur. Minimum ve maksimum değerler sağlandığında optimizer, filtre koşullarının seçiciliğini daha doğru tahmin edebilir ve daha iyi bir çalıştırma planı oluşturabilir.

Senaryo 2: Okunan veri miktarını azaltmak için filtre koşullarını depolama katmanına itme.

MaxCompute'te a < -90 gibi bir filtre koşulu, veri okumalarını azaltmak için depolama katmanına itilebilir. Ancak a değişkeninin taşma riski nedeniyle a + 100 < 10 gibi bir koşul itilemez. a değişkeninin maksimum değeri biliniyorsa optimizer, ikinci koşulu güvenli bir şekilde itilebilen eşdeğer bir koşula dönüştürebilir. Bu sayede daha fazla koşul itilebilir, veri okumaları azalır ve maliyetlerden tasarruf edilir.

nNulls (null sayısı)

Değerlendirme verimliliğini artırmak için null değerlerle ilgili bilgileri kullanır.

Senaryo 1: Bir iş çalışırken NULL kontrollerini azaltma.

Bir iş çalışırken herhangi bir veri türü için NULL değerlerini kontrol etmesi gerekir. nNulls değerinin 0 olduğu biliniyorsa bu kontrol atlanabilir ve hesaplama performansı artırılabilir.

Senaryo 2: Filtre koşullarına göre verileri kırpma.

Bir sütundaki tüm değerler NULL ise tipik bir filtre koşulu always false koşuluna dönüştürülüp kırpılabilir. Bu işlem kırpma verimliliğini artırır.

avgColLen (ortalama sütun uzunluğu) veya maxColLen (maksimum sütun uzunluğu)

Kaynak tüketimini tahmin etmek ve karıştırmaları (shuffles) azaltmak için sütun uzunluğu bilgilerini elde eder.

Senaryo 1: Hash kümeli tablolar için belleği tahmin etme.

Örneğin avgColLen, değişken uzunluklu alanların bellek tüketimini ve dolayısıyla bir kaydın bellek tüketimini tahmin etmek için kullanılabilir. Bu sayede optimizer, bir karıştırma işlemini ortadan kaldırmak için hash kümeli bir tablo oluşturan ve yayınlama mekanizması kullanan Auto MapJoin'i seçici olarak uygulayabilir. Büyük giriş tabloları içeren senaryolarda bir karıştırma işleminin ortadan kaldırılması performansı önemli ölçüde artırır.

Senaryo 2: Karıştırılan veri miktarını azaltma.

Yok.

ndv (farklı değer sayısı)

Çalıştırma planının kalitesini artırmak için kardinalite bilgilerini kullanır.

Senaryo 1: JOIN için çıktı kayıt sayısını tahmin etme.

  • Veri şişmesi: Her iki tablodaki join anahtarlarının ndv değeri satır sayısından çok daha küçükse bu durum yüksek sayıda yinelenen değer ve yüksek veri şişmesi olasılığını gösterir. Optimizer, veri şişmesinden kaynaklanan sorunları önlemek için önlemler alabilir.

  • Veri filtreleme: Küçük tablonun ndv değeri büyük tablonunkinden çok daha küçükse JOIN işleminden sonra büyük tablodan gelen verilerin büyük bir kısmı filtrelenecektir. Optimizer, optimizasyon kararları vermek için bu bilgileri kullanabilir.

Senaryo 2: JOIN sıralaması.

Tahmini çıktı kayıt sayısına dayanarak optimizer ayrıca JOIN sırasını otomatik olarak ayarlayabilir. Örneğin verileri filtreleyen JOIN işlemlerini daha erken bir aşamaya, veri şişmesine neden olan JOIN işlemlerini ise daha sonraki bir aşamaya taşıyabilir.

topK (en sık görülen ilk K değer)

Veri dağılımını tahmin ederek veri eğriliğinin performans üzerindeki etkisini azaltır.

Senaryo 1: Eğri verilerdeki JOIN işlemlerini optimize etme.

Bir JOIN için girişler her ikisi de büyük olduğunda ve daha küçük tablo MapJoin için belleğe tamamen yüklenemediğinde bir veri akışı eğri olabilirken diğerleri olmayabilir. MaxCompute, işlemi eğri veriler için MapJoin ve eğri olmayan veriler için MergeJoin kullanacak şekilde otomatik olarak dönüştürebilir. Her iki bölümden elde edilen sonuçlar daha sonra birleştirilir. Bu özellik, büyük hacimli JOIN'ler için önemli avantajlar sağlar ve bir arızadan sonra gereken manuel çabayı azaltır.

Senaryo 2: Çıktı kayıt sayısını tahmin etme.

ndv, min ve max kullanarak çıktı kayıt sayısının tahmin edilmesi eşit bir veri dağılımı varsayar. Veriler önemli ölçüde eğriyse bu varsayım hatalı tahminlere yol açar. Eğri veriler özel bir durum olarak ele alınır ve eşit dağılım varsayımı kalan verilere uygulanır.

Analyze kullanma talimatları

Sütun istatistiklerini toplama

Bu bölümde Analyze'ün bölümlenmiş ve bölümlenmemiş tablolarla nasıl kullanılacağı açıklanmaktadır.

  • Bölümlenmemiş tablolar

    Belirli sütunlar veya tüm sütunlar için sütun istatistiklerini toplayabilirsiniz.

    1. MaxCompute istemcisi kullanarak analyze2_test adlı bir bölümlenmemiş tablo oluşturun. Aşağıda örnek bir komut verilmiştir:

      create table if not exists analyze2_test (tinyint1 tinyint, smallint1 smallint, int1 int, bigint1 bigint, double1 double, decimal1 decimal, decimal2 decimal(20,10), string1 string, varchar1 varchar(10), boolean1 boolean, timestamp1 timestamp, datetime1 datetime ) lifecycle 30;
    2. Tabloya veri ekleyin. Aşağıda örnek bir komut verilmiştir:

      insert overwrite table analyze2_test select * from values (1Y, 20S, 4, 8L, 123452.3, 12.4, 52.5, 'str1', 'str21', false, timestamp '2018-09-17 00:00:00', datetime '2018-09-17 00:59:59') ,(10Y, 2S, 7, 11111118L, 67892.3, 22.4, 42.5, 'str12', 'str200', true, timestamp '2018-09-17 00:00:00', datetime '2018-09-16 00:59:59') ,(20Y, 7S, 4, 2222228L, 12.3, 2.4, 2.57, 'str123', 'str2', false, timestamp '2018-09-18 00:00:00', datetime '2018-09-17 00:59:59') ,(null, null, null, null, null, null, null, null, null, null, null , null) as t(tinyint1, smallint1, int1, bigint1, double1, decimal1, decimal2, string1, varchar1, boolean1, timestamp1, datetime1);
    3. Tek bir sütun, birden çok sütun veya tüm sütunlar için sütun istatistiklerini toplamak üzere analyze komutunu çalıştırın. Aşağıda örnek komutlar verilmiştir:

      -- Collect column stats for the tinyint1 column.
      analyze table analyze2_test compute statistics for columns (tinyint1); 
      
      -- Collect column stats for the smallint1, string1, boolean1, and timestamp1 columns.
      analyze table analyze2_test compute statistics for columns (smallint1, string1, boolean1, timestamp1);
      
      -- Collect column stats for all columns.
      analyze table analyze2_test compute statistics for columns;
    4. Toplanan sütun istatistiklerini kontrol etmek için show statistic komutunu çalıştırın. Aşağıda örnek komutlar verilmiştir:

      -- Check the collected column stats for the tinyint1 column.
      show statistic analyze2_test columns (tinyint1);
      
      -- Check the collected column stats for the smallint1, string1, boolean1, and timestamp1 columns.
      show statistic analyze2_test columns (smallint1, string1, boolean1, timestamp1);
      
      -- Check the collected column stats for all columns.
      show statistic analyze2_test columns;

      Aşağıdaki sonuçlar döndürülür:

      -- Collected column stats for the tinyint1 column.
      ID = 20201126085225150gnqo****
      tinyint1:MaxValue:      20                   -- Corresponds to max.
      tinyint1:DistinctNum:   4.0                  -- Corresponds to ndv.
      tinyint1:MinValue:      1                    -- Corresponds to min.
      tinyint1:NullNum:       1.0                  -- Corresponds to nNulls.
      tinyint1:TopK:  {1=1.0, 10=1.0, 20=1.0}      -- Corresponds to topK. 10=1.0 indicates that the value 10 appears once. topK displays up to the top 20 most frequent values.
      
      -- Collected column stats for the smallint1, string1, boolean1, and timestamp1 columns.
      ID = 20201126091636149gxgf****
      smallint1:MaxValue:     20
      smallint1:DistinctNum:  4.0
      smallint1:MinValue:     2
      smallint1:NullNum:      1.0
      smallint1:TopK:         {2=1.0, 7=1.0, 20=1.0}
      
      string1:MaxLength       6.0                  -- Corresponds to maxColLen.
      string1:AvgLength:      3.0                  -- Corresponds to avgColLen.
      string1:DistinctNum:    4.0
      string1:NullNum:        1.0
      string1:TopK:   {str1=1.0, str12=1.0, str123=1.0}
      
      boolean1:DistinctNum:   3.0
      boolean1:NullNum:       1.0
      boolean1:TopK:  {false=2.0, true=1.0}
      
      timestamp1:DistinctNum:         3.0
      timestamp1:NullNum:     1.0
      timestamp1:TopK:        {2018-09-17 00:00:00.0=2.0, 2018-09-18 00:00:00.0=1.0}
      
      -- Collected column stats for all columns.
      ID = 20201126092022636gzm1****
      tinyint1:MaxValue:      20
      tinyint1:DistinctNum:   4.0
      tinyint1:MinValue:      1
      tinyint1:NullNum:       1.0
      tinyint1:TopK:  {1=1.0, 10=1.0, 20=1.0}
      
      smallint1:MaxValue:     20
      smallint1:DistinctNum:  4.0
      smallint1:MinValue:     2
      smallint1:NullNum:      1.0
      smallint1:TopK:         {2=1.0, 7=1.0, 20=1.0}
      
      int1:MaxValue:  7
      int1:DistinctNum:       3.0
      int1:MinValue:  4
      int1:NullNum:   1.0
      int1:TopK:      {4=2.0, 7=1.0}
      
      bigint1:MaxValue:       11111118
      bigint1:DistinctNum:    4.0
      bigint1:MinValue:       8
      bigint1:NullNum:        1.0
      bigint1:TopK:   {8=1.0, 2222228=1.0, 11111118=1.0}
      
      double1:MaxValue:       123452.3
      double1:DistinctNum:    4.0
      double1:MinValue:       12.3
      double1:NullNum:        1.0
      double1:TopK:   {12.3=1.0, 67892.3=1.0, 123452.3=1.0}
      
      decimal1:MaxValue:      22.4
      decimal1:DistinctNum:   4.0
      decimal1:MinValue:      2.4
      decimal1:NullNum:       1.0
      decimal1:TopK:  {2.4=1.0, 12.4=1.0, 22.4=1.0}
      
      decimal2:MaxValue:      52.5
      decimal2:DistinctNum:   4.0
      decimal2:MinValue:      2.57
      decimal2:NullNum:       1.0
      decimal2:TopK:  {2.57=1.0, 42.5=1.0, 52.5=1.0}
      
      string1:MaxLength       6.0
      string1:AvgLength:      3.0
      string1:DistinctNum:    4.0
      string1:NullNum:        1.0
      string1:TopK:   {str1=1.0, str12=1.0, str123=1.0}
      
      varchar1:MaxLength      6.0
      varchar1:AvgLength:     3.0
      varchar1:DistinctNum:   4.0
      varchar1:NullNum:       1.0
      varchar1:TopK:  {str2=1.0, str200=1.0, str21=1.0}
      
      boolean1:DistinctNum:   3.0
      boolean1:NullNum:       1.0
      boolean1:TopK:  {false=2.0, true=1.0}
      
      timestamp1:DistinctNum:         3.0
      timestamp1:NullNum:     1.0
      timestamp1:TopK:        {2018-09-17 00:00:00.0=2.0, 2018-09-18 00:00:00.0=1.0}
      
      datetime1:DistinctNum:  3.0
      datetime1:NullNum:      1.0
      datetime1:TopK:         {1537117199000=2.0, 1537030799000=1.0}
  • Bölümlenmiş tablolar

    Belirli bir bölüm için sütun istatistiklerini toplayabilirsiniz.

    1. Aşağıdaki örnekte MaxCompute istemcisi kullanılarak srcpart adlı bir bölümlenmiş tablo oluşturma komutu gösterilmektedir:

      create table if not exists srcpart_test (key string, value string) partitioned by (ds string, hr string) lifecycle 30;
    2. Tabloya veri ekleyin. Aşağıda örnek bir komut verilmiştir:

      insert into table srcpart_test partition(ds='20201220', hr='11') values ('123', 'val_123'), ('76', 'val_76'), ('447', 'val_447'), ('1234', 'val_1234');
      insert into table srcpart_test partition(ds='20201220', hr='12') values ('3', 'val_3'), ('12331', 'val_12331'), ('42', 'val_42'), ('12', 'val_12');
      insert into table srcpart_test partition(ds='20201221', hr='11') values ('543', 'val_543'), ('2', 'val_2'), ('4', 'val_4'), ('9', 'val_9');
      insert into table srcpart_test partition(ds='20201221', hr='12') values ('23', 'val_23'), ('56', 'val_56'), ('4111', 'val_4111'), ('12333', 'val_12333');
    3. Belirli bir bölüm için sütun istatistiklerini toplamak üzere analyze komutunu çalıştırın. Aşağıda örnek bir komut verilmiştir:

      analyze table srcpart_test partition(ds='20201221') compute statistics for columns (key , value);
    4. Toplanan sütun istatistiklerini kontrol etmek için show statistic komutunu çalıştırın. Aşağıda örnek bir komut verilmiştir:

      show statistic srcpart_test partition (ds='20201221') columns (key , value);

      Aşağıdaki sonuçlar döndürülür:

      ID = 20210105121800689g28p****
      (ds=20201221,hr=11) key:MaxLength       3.0
      (ds=20201221,hr=11) key:AvgLength:      1.0
      (ds=20201221,hr=11) key:DistinctNum:    4.0
      (ds=20201221,hr=11) key:NullNum:        0.0
      (ds=20201221,hr=11) key:TopK:   {2=1.0, 4=1.0, 543=1.0, 9=1.0}
      
      (ds=20201221,hr=11) value:MaxLength     7.0
      (ds=20201221,hr=11) value:AvgLength:    5.0
      (ds=20201221,hr=11) value:DistinctNum:  4.0
      (ds=20201221,hr=11) value:NullNum:      0.0
      (ds=20201221,hr=11) value:TopK:         {val_2=1.0, val_4=1.0, val_543=1.0, val_9=1.0}
      
      (ds=20201221,hr=12) key:MaxLength       5.0
      (ds=20201221,hr=12) key:AvgLength:      3.0
      (ds=20201221,hr=12) key:DistinctNum:    4.0
      (ds=20201221,hr=12) key:NullNum:        0.0
      (ds=20201221,hr=12) key:TopK:   {12333=1.0, 23=1.0, 4111=1.0, 56=1.0}
      
      (ds=20201221,hr=12) value:MaxLength     9.0
      (ds=20201221,hr=12) value:AvgLength:    7.0
      (ds=20201221,hr=12) value:DistinctNum:  4.0
      (ds=20201221,hr=12) value:NullNum:      0.0
      (ds=20201221,hr=12) value:TopK:         {val_12333=1.0, val_23=1.0, val_4111=1.0, val_56=1.0}

Meta verilerdeki tablo kayıt sayısını yenileme

MaxCompute'teki çeşitli görevler bir tablodaki kayıt sayısını değiştirebilir. Ancak bu görevler kayıt sayısını her zaman doğru şekilde güncellemeyebilir. Dağıtılmış görevlerin dinamik yapısı ve veri güncellemelerinin zamanlaması nedeniyle bu durum meydana gelebilir. Kayıt sayısının doğru olduğundan emin olmak için meta verilerdeki değeri yenilemek amacıyla analyze komutunu kullanabilirsiniz. Bir tablonun kayıt sayısını DataWorks Data Map'te görüntüleyebilirsiniz. Daha fazla bilgi için bkz. Tablo ayrıntılarını görüntüleme.

  • Tüm tablo için kayıt sayısını yenilemek için:

    set odps.sql.analyze.table.stats=only; 
    analyze table <table_name> compute statistics for columns;  

    table_name tablonun adıdır.

  • Tablodaki belirli bir sütun için kayıt sayısını yenilemek için:

    set odps.sql.analyze.table.stats=only; 
    analyze table <table_name> compute statistics for columns (<column_name>);

    table_name tablonun adı, column_name ise sütunun adıdır.

  • Bir bölümdeki belirli bir sütun için kayıt sayısını yenilemek için:

    set odps.sql.analyze.table.stats=only; 
    analyze table <table_name> partition(<pt_spec>) compute statistics for columns (<column_name>);

    table_name tablonun adı, pt_spec bölüm değeri ve column_name sütunun adıdır.

Freeride kullanma talimatları

Özellikleri oturum düzeyinde ayarlamak için aşağıdaki iki komutu çalıştırabilirsiniz:

  • set odps.optimizer.stat.collect.auto=true;: Freeride özelliğini etkinleştirerek tablolar için sütun istatistiklerini otomatik olarak toplar.

  • set odps.optimizer.stat.collect.plan=xx;: Belirtilen sütunlar için belirli sütun istatistiği ölçümlerini toplamak üzere bir toplama planı yapılandırır.

    -- Collect the avgColLen metric for the key column in the target_table table.
    set odps.optimizer.stat.collect.plan={"target_table":"{\"key\":\"AVG_COL_LEN\"}"}
    
    -- Collect the min and max metrics for the s_binary column and the topK and nNulls metrics for the s_int column in the target_table table.
    set odps.optimizer.stat.collect.plan={"target_table":"{\"s_binary\":\"MIN,MAX\",\"s_int\":\"TOPK,NULLS\"}"};
Not

Bu özellikleri yapılandırdıktan sonra istatistikler toplanmazsa Freeride özelliği etkinleştirilmemiş olabilir. Logview'deki odps.optimizer.stat.collect.auto özelliği için json summary sekmesini kontrol edebilirsiniz. Özellik bulunamazsa sunucu sürümünüz bu özelliği desteklemek için çok düşüktür. Alibaba Cloud, MaxCompute sunucularını Freeride'i destekleyen sürümlere kademeli olarak yükseltecektir.

Aşağıdaki listede sütun istatistiği ölçümleri ile set odps.optimizer.stat.collect.plan=xx; komutundaki tanımlayıcıları arasındaki eşleme gösterilmektedir:

  • min: MIN

  • max: MAX

  • nNulls: NULLS

  • avgColLen: AVG_COL_LEN

  • maxColLen: MAX_COL_LEN

  • ndv: NDV

  • topK: TOPK

create table, insert into veya insert overwrite kullandığınızda MaxCompute, sütun istatistiklerini toplamak için Freeride'i tetikleyebilir.

Bu üç yöntemi göstermek için önce src_test adlı bir kaynak tablo oluşturun ve buna veri ekleyin. Aşağıda örnek komutlar verilmiştir:

create table if not exists src_test (key string, value string);
insert overwrite table src_test values ('100', 'val_100'), ('100', 'val_50'), ('200', 'val_200'), ('200', 'val_300');
  • create table: Hedef tabloyu oluşturduğunuzda sütun istatistikleri toplanır. Aşağıda örnek bir komut verilmiştir:

    -- Create the target table.
    set odps.optimizer.stat.collect.auto=true;
    set odps.optimizer.stat.collect.plan={"target_test":"{\"key\":\"AVG_COL_LEN,NULLS\"}"};
    create table target_test as select key, value from src_test;
    -- Check the collected column stats.
    show statistic target_test columns;

    Aşağıdaki sonuçlar döndürülür:

    key:AvgLength: 3.0
    key:NullNum:  0.0
  • insert into: insert into kullanarak veri eklediğinizde sütun istatistikleri toplanır. Aşağıda örnek bir komut verilmiştir:

    -- Create a target table.
    create table freeride_insert_into_table like src_test;
    -- Append data.
    set odps.optimizer.stat.collect.auto=true;
    set odps.optimizer.stat.collect.plan={"freeride_insert_into_table":"{\"key\":\"AVG_COL_LEN,NULLS\"}"};
    insert into table freeride_insert_into_table select key, value from src order by key, value limit 10;
    -- Check the collected column stats.
    show statistic freeride_insert_into_table columns;
  • insert overwrite: insert overwrite kullanarak verilerin üzerine yazdığınızda sütun istatistikleri toplanır. Aşağıda örnek bir komut verilmiştir:

    -- Create a target table.
    create table freeride_insert_overwrite_table like src_test;
    -- Overwrite data.
    set odps.optimizer.stat.collect.auto=true;
    set odps.optimizer.stat.collect.plan={"freeride_insert_overwrite_table":"{\"key\":\"AVG_COL_LEN,NULLS\"}"};
    insert overwrite table freeride_insert_overwrite_table select key, value from src_test order by key, value limit 10;
    -- Check the collected column stats.
    show statistic freeride_insert_overwrite_table columns;