ApsaraDB for SelectDB, maliyet tabanlı en iyi duruma getiricinin (CBO) verimli sorgu planları seçmesine yardımcı olmak için sütun bazlı istatistikler toplar. Toplama işlemini manuel olarak tetikleyebilir veya sistemin istatistikleri otomatik olarak toplamasına izin verebilirsiniz.
Çalışma mekanizması
Sorgu en iyi duruma getirme sırasında CBO, koşul seçilebilirliğini tahmin etmek ve yürütme planı maliyetlerini karşılaştırmak için istatistikleri kullanır. Doğru istatistikler daha iyi plan seçimlerine ve daha hızlı sorgulara olanak tanır.
Toplanan tüm istatistikler __internal_schema.column_statistics dahili tablosuna yazılır. Herhangi bir toplama işi çalıştırılmadan önce ön uç (FE), bu tablodaki tüm tabletlerin kullanılabilir olduğunu kontrol eder. Kullanılamayan bir tablet tespit edilirse iş reddedilir.
Sütun başına toplanan istatistikler
SelectDB her sütun için aşağıdaki istatistikleri toplar:
| Alan | Açıklama |
|---|---|
row_count |
Toplam satır sayısı |
data_size |
Toplam veri boyutu |
avg_size_byte |
Bayt cinsinden ortalama değer uzunluğu |
ndv |
Farklı değer sayısı |
min |
Minimum değer |
max |
Maksimum değer |
null_count |
Null değer sayısı |
Bir toplama yöntemi seçin
İki toplama yöntemi mevcuttur. Tablo boyutuna ve iş yükünüzün doğruluk gereksinimlerine göre seçim yapın.
| Yöntem | Çalışma şekli | Denge unsuru |
|---|---|---|
| Tam toplama | Tablonun tamamını tarar | En doğru sonuç; daha yüksek kaynak maliyeti ve daha yavaş |
| Örnekleme ile toplama | Satırların bir alt kümesini veya tablonun belirli bir yüzdesini tarar | Daha hızlı ve kaynak açısından daha hafif; biraz daha az doğru |
5 GiB'ten büyük tablolar için zaman aşımlarını ve aşırı arka uç (BE) belleği kullanımını önlemek amacıyla örnekleme ile toplamayı kullanın.
İstatistikleri manuel olarak toplayın
İhtiyaç duyulduğunda istatistikleri toplamak veya yenilemek için ANALYZE ifadesini çalıştırın.
Söz dizimi
ANALYZE < TABLE | DATABASE table_name | db_name >
[ (column_name [, ...]) ]
[ [ WITH SYNC ] [ WITH SAMPLE PERCENT | ROWS ] ];
Parametreler
| Parametre | Açıklama |
|---|---|
table_name |
Analiz edilecek tablo. Veritabanını belirtmek için database_name.table_name biçimini kullanın. |
column_name |
Analiz edilecek bir veya daha fazla sütun. Birden fazla sütun adını virgülle ayırın. |
WITH SYNC |
İşlemi eşzamanlı olarak çalıştırın ve tamamlanmasının ardından sonucu döndürün. Bu seçenek olmadan işlem eşzamansız olarak çalışır ve bir iş kimliği döndürür. |
WITH SAMPLE PERCENT | ROWS |
Örnekleme ile toplamayı kullanın. Bir örnekleme oranı (yüzde) veya sabit bir satır sayısı belirtin. |
Örnekler
Satırların %10'unu örnekleyerek istatistik toplayın:
ANALYZE TABLE lineitem WITH SAMPLE PERCENT 10;
100.000 satır örnekleyerek istatistik toplayın:
ANALYZE TABLE lineitem WITH SAMPLE ROWS 100000;
Otomatik toplamayı yapılandırın
Otomatik toplama varsayılan olarak etkindir. Her içe aktarma işlemi gerçekleştikten sonra SelectDB, etkilenen tabloların istatistik sağlığını yeniden hesaplar ve gerektiğinde toplama işlerini tetikler.
Sağlık puanının çalışma şekli
İstatistik sağlığı 0 ila 100 arasında bir değerdir. Aşağıdaki koşulların tümü karşılandığında otomatik toplama tetiklenir:
Tablo son toplamadan bu yana güncellendi.
Sağlık puanı yapılandırılan eşik değerin altına düştü.
Büyük tablolar için: Son toplamadan bu yana minimum toplama aralığı geçti.
Sağlık puanı ayrıntıları:
İstatistiği olmayan bir tablonun sağlık puanı 0'dır.
Her içe aktarma işleminden sonra SelectDB, güncellenen satır oranına dayanarak yeni sağlık durumunu tahmin eder.
Sağlık durumu
table_stats_health_threshold(varsayılan: 60) değerinin altına düşerse tablo eski kabul edilir ve toplama için planlanır.
Büyük tablo stratejisi
huge_table_lower_bound_size_in_bytes (varsayılan: 5 GiB) değerinden büyük tablolar için:
SelectDB otomatik olarak örnekleme ile toplamayı kullanır ve
huge_table_default_sample_rowssatır (varsayılan: 4.194.304) örnekler.Bu süre zarfındaki sağlık puanı değişikliklerinden bağımsız olarak toplama işlemi en fazla
huge_table_auto_analyze_interval_in_millis(varsayılan: 12 saat) başına bir kez çalışır.
Daha doğru istatistikler için örnekleme derinliğini artırmak üzere huge_table_default_sample_rows değerini yükseltin.
Toplamayı yoğun olmayan saatlerle sınırlayın
Üretim iş yüklerini etkilememek için otomatik toplama için bir zaman penceresi ayarlayın:
SET auto_analyze_start_time = '02:00:00';
SET auto_analyze_end_time = '06:00:00';
Otomatik toplamayı devre dışı bırakın
SET enable_auto_analyze = false;
Harici katalog
Büyük geçmiş veri kümelerinden kaynaklanan aşırı kaynak tüketimini önlemek için harici kataloglarda otomatik toplama varsayılan olarak devre dışıdır. Katalog başına etkinleştirin veya devre dışı bırakın:
-- Enable automatic collection for an external catalog
ALTER CATALOG external_catalog SET PROPERTIES ('enable.auto.analyze'='true');
-- Disable automatic collection for an external catalog
ALTER CATALOG external_catalog SET PROPERTIES ('enable.auto.analyze'='false');
Toplama işlerini yönetin
Toplama işlerini görüntüleyin
SHOW [AUTO] ANALYZE < table_name | job_id >
[ WHERE [ STATE = [ "PENDING" | "RUNNING" | "FINISHED" | "FAILED" ] ] ];
| Parametre | Açıklama |
|---|---|
AUTO |
Geçmiş otomatik toplama işlerini gösterin. Varsayılan olarak yalnızca en son 20.000 tamamlanmış otomatik iş saklanır. |
table_name |
Tabloya göre filtreleyin. database_name.table_name biçimini kullanın. Atlanırsa tüm işler döndürülür. |
job_id |
İş kimliğine göre filtreleyin. İş kimliği, ANALYZE ifadesini eşzamansız modda çalıştırdığınızda döndürülür. Atlanırsa tüm işler döndürülür. |
Örnek:
SHOW ANALYZE 245073\G;
*************************** 1. row ***************************
job_id: 245073
catalog_name: internal
db_name: default_cluster:tpch
tbl_name: lineitem
col_name: [l_returnflag,l_receiptdate,l_tax,l_shipmode,l_suppkey,l_shipdate,
l_commitdate,l_partkey,l_orderkey,l_quantity,l_linestatus,l_comment,
l_extendedprice,l_linenumber,l_discount,l_shipinstruct]
job_type: MANUAL
analysis_type: FUNDAMENTALS
message:
last_exec_time_in_ms: 2023-11-07 11:00:52
state: FINISHED
progress: 16 Finished | 0 Failed | 0 In Progress | 16 Total
schedule_type: ONCE
Çıktı alanları:
| Alan | Açıklama |
|---|---|
job_id |
İş kimliği |
catalog_name |
Katalog adı |
db_name |
Veritabanı adı |
tbl_name |
Tablo adı |
col_name |
Analiz edilen sütunlar |
job_type |
İş türü: MANUAL veya AUTO |
analysis_type |
İstatistik türü |
message |
İstatistik toplama işiyle ilgili bilgiler. |
last_exec_time_in_ms |
Son yürütme zaman damgası |
state |
İş durumu: PENDING, RUNNING, FINISHED veya FAILED |
progress |
Görev tamamlanma dökümü |
schedule_type |
Zamanlama yöntemi: Tek seferlik işler için ONCE |
Tablo düzeyindeki istatistikleri görüntüleyin
SHOW TABLE STATS <table_name>;
Örnek:
SHOW TABLE STATS lineitem\G
*************************** 1. row ***************************
updated_rows: 0
query_times: 0
row_count: 6001215
updated_time: 2023-11-07
columns: [l_returnflag, l_receiptdate, l_tax, l_shipmode, l_suppkey, l_shipdate,
l_commitdate, l_partkey, l_orderkey, l_quantity, l_linestatus, l_comment,
l_extendedprice, l_linenumber, l_discount, l_shipinstruct]
trigger: MANUAL
Çıktı alanları:
| Alan | Açıklama |
|---|---|
updated_rows |
Son ANALYZE ifadesi tarafından güncellenen tablo satırlarının sayısı. |
query_times |
Rezerve edildi; ileriki bir sürümde sorgu sayısını gösterecek |
row_count |
Tablo satırlarının sayısı. Bu parametrenin değeri yürütme sırasındaki kesin satır sayısını göstermez. |
updated_time |
İstatistiklerin en son ne zaman güncellendiği |
columns |
İstatistikleri toplanan sütunlar |
trigger |
Son toplamanın nasıl tetiklendiği |
Sütun düzeyindeki görev durumunu görüntüleyin
Her toplama işi sütun başına bir görev oluşturur. Belirli bir iş için görev durumunu görüntülemek için:
SHOW ANALYZE TASK STATUS [job_id]
Örnek:
SHOW ANALYZE TASK STATUS 20038;
+---------+----------+---------+----------------------+----------+
| task_id | col_name | message | last_exec_time_in_ms | state |
+---------+----------+---------+----------------------+----------+
| 20039 | col4 | | 2023-06-01 17:22:15 | FINISHED |
| 20040 | col2 | | 2023-06-01 17:22:15 | FINISHED |
| 20041 | col3 | | 2023-06-01 17:22:15 | FINISHED |
| 20042 | col1 | | 2023-06-01 17:22:15 | FINISHED |
+---------+----------+---------+----------------------+----------+
Sütun istatistiklerini görüntüleyin
SHOW COLUMN [cached] STATS table_name [ (column_name [, ...]) ];
| Parametre | Açıklama |
|---|---|
cached |
Şu anda FE belleğinde önbelleğe alınan istatistikleri gösterin |
table_name |
İncelenecek tablo. database_name.table_name biçimini kullanın. |
column_name |
Bir veya daha fazla sütun. Birden fazla sütun adını virgülle ayırın. |
Örnek:
SHOW COLUMN STATS lineitem(l_tax)\G
*************************** 1. row ***************************
column_name: l_tax
count: 6001215.0
ndv: 9.0
num_null: 0.0
data_size: 4.800972E7
avg_size_byte: 8.0
min: 0.00
max: 0.08
method: FULL
type: FUNDAMENTALS
trigger: MANUAL
query_times: 0
updated_time: 2023-11-07 11:00:46
Bir toplama işini durdurun
KILL ANALYZE job_id;
İş kimliği, eşzamansız modda ANALYZE tarafından döndürülür veya SHOW ANALYZE komutundan alınır.
Örnek:
KILL ANALYZE 52357;
Oturum değişkenleri ve FE yapılandırma öğeleri
Oturum değişkenleri
| Değişken | Varsayılan | Açıklama |
|---|---|---|
auto_analyze_start_time |
00:00:00 |
Otomatik toplama penceresinin başlangıç zamanı |
auto_analyze_end_time |
23:59:59 |
Otomatik toplama penceresinin bitiş zamanı |
enable_auto_analyze |
true |
Otomatik toplamayı etkinleştirin veya devre dışı bırakın |
huge_table_default_sample_rows |
4194304 |
Büyük tablolar için örneklenen satır sayısı |
huge_table_lower_bound_size_in_bytes |
5368709120 |
Bir tablonun büyük olarak kabul edilmesi için gereken boyut eşiği (varsayılan: 5 GiB) |
huge_table_auto_analyze_interval_in_millis |
43200000 |
Büyük tablolar için otomatik toplamalar arasındaki minimum aralık (varsayılan: 12 saat) |
table_stats_health_threshold |
60 |
Sağlık puanı eşiği (0–100). Sağlığı bu değerin altına düşen bir tablo eski kabul edilir. |
analyze_timeout |
43200 |
Bir toplama işi için saniye cinsinden zaman aşımı |
auto_analyze_table_width_threshold |
70 |
Otomatik toplamaya katılabilmesi için bir tablonun sahip olabileceği maksimum sütun sayısı |
FE yapılandırma öğeleri
Bu öğeler arka plan davranışını kontrol eder. Çoğu durumda varsayılan değerler yeterlidir.
| FE yapılandırma öğesi | Varsayılan | Açıklama |
|---|---|---|
analyze_record_limit |
20000 |
Kalıcı olarak depolanan maksimum iş yürütme kaydı sayısı |
stats_cache_size |
500000 |
FE tarafında önbelleğe alınan maksimum istatistik satırı sayısı |
statistics_simultaneously_running_task_num |
3 |
Eşzamanlı çalışan maksimum eşzamansız toplama işi sayısı |
statistics_sql_mem_limit_in_bytes |
2147483648 |
Toplama için kullanılan SQL ifadesi başına maksimum BE belleği (varsayılan: 2 GiB) |
SSS
ANALYZE çalıştırıldıktan sonra "Stats table not available..." hatası görünüyor
Tüm BE düğümlerinin normal durumda olduğunu onaylamak için SHOW BACKENDS komutunu çalıştırın. BE'ler sağlıklı görünüyorsa dahili istatistik tablosunun tablet durumunu kontrol edin:
ADMIN SHOW REPLICA STATUS FROM __internal_schema.[tbl_in_this_db];
Tüm tabletlerin normal bir durum gösterdiğinden emin olun. FE, herhangi bir ANALYZE isteğini kabul etmeden önce tablet kullanılabilirliğini kontrol eder ve __internal_schema.column_statistics içindeki herhangi bir tablet kullanılamazsa isteği reddeder.
Büyük bir tabloda istatistik toplama başarısız oluyor
Tam tarama yerine örnekleme ile toplamayı kullanın. ANALYZE için ayrılan kaynaklar kesinlikle sınırlıdır ve büyük bir tablonun tam taraması zaman aşımına uğrayabilir veya BE belleğini tüketebilir:
ANALYZE TABLE <table_name> WITH SAMPLE PERCENT 10;
Tablo boyutuna ve ihtiyaç duyduğunuz doğruluğa bağlı olarak örnekleme oranını ayarlayın.