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):
analyzekomutunu kullanarak istatistikleri eşzamansız olarak toplayabilirsiniz. Bu yöntemi manuel olarak başlatmanız gerekir.NotMaxCompute 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 | ||
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. |
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 | ||
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 |
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. |
|
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. |
|
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.
-
MaxCompute istemcisi kullanarak
analyze2_testadlı 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; -
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); -
Tek bir sütun, birden çok sütun veya tüm sütunlar için sütun istatistiklerini toplamak üzere
analyzekomutunu ç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; -
Toplanan sütun istatistiklerini kontrol etmek için
show statistickomutunu ç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.
-
Aşağıdaki örnekte MaxCompute istemcisi kullanılarak
srcpartadlı 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; -
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'); -
Belirli bir bölüm için sütun istatistiklerini toplamak üzere
analyzekomutunu ç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); -
Toplanan sütun istatistiklerini kontrol etmek için
show statistickomutunu ç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_nametablonun 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_nametablonun adı,column_nameise 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_nametablonun adı,pt_specbölüm değeri vecolumn_namesü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\"}"};
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 intokullanarak 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 overwritekullanarak 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;