Database Autonomy Service (DAS) içindeki maliyet tabanlı SQL tanılama motoru, SQL deyimlerini analiz eder, dizinler önerir ve sorgu yeniden yazmaları tavsiye eder; böylece herhangi bir değişiklik uygulanmadan önce performans kazançlarını tahmin eder. Önerilen iyileştirme adaylarını veritabanı iyileştiricisiyle aynı maliyet modelini kullanarak değerlendirir; bu sayede öneriler sezgisel yaklaşımlar yerine gerçek çalıştırma maliyetlerine dayanır.
SQL optimizasyonu neden zordur?
Veritabanı performans sorunlarının yaklaşık %80'i SQL kaynaklıdır. Ancak SQL optimizasyonu, veritabanı yönetiminin en zaman alıcı görevlerinden biridir: En uygun yürütme planı veri hacmi, istatistikler, dizin kombinasyonları ve sorgu yapısına bağlıdır ve bunların tümü sürekli değişir.
Geliştiriciler genellikle yavaş sorguları belirlemek, yürütme planlarını analiz etmek ve dizin değişikliklerini test etmek için saatler harcar. Maliyet tabanlı SQL tanılama motoru bu süreci otomatikleştirerek manuel ve uzmanlık gerektiren bir iş akışını sürekli ve ölçeklenebilir şekilde çalışan bir sürece dönüştürür.
Motorun çalışma şekli
Bu motor, veritabanı çekirdeğinden bağımsız olarak çalışan bir iyileştiricidir. İstatistikleri otomatik olarak toplar ve MySQL gibi açık kaynak veritabanlarında yaygın bir sınırlama olan veritabanının yerleşik What-If Tool (WIT) yeteneğine güvenmeden yürütme planı maliyetlerini hesaplar.

Motor, her SQL deyimi aşağıdaki dört adımdan geçirerek işler:
SQL ayrıştırma ve doğrulama: SQL deyimini ayrıştırın, sözdizimini doğrulayın; yüklemeleri, sıralama alanlarını, toplama alanlarını ve sorgu alanlarını tanımlayarak bir sözdizim ağacı oluşturun. Başvurulan tüm tabloların ve alanların veritabanı şemasıyla eşleştiğini kontrol edin.
Aday dizin oluşturma: Sözdizim ağacından birden fazla dizin kombinasyonu üretin.
Maliyet tabanlı değerlendirme: Veritabanı çekirdeğinden bağımsız yerleşik bir iyileştirici kullanarak veritabanı istatistiklerini (tanılama motorunda önbelleğe alınmış) getirin ve her aday dizin ile her aday SQL yeniden yazmasının maliyetini hesaplayın. En düşük maliyete sahip seçeneği belirleyin.
Dizin birleştirme ve en uygun dizin seçimi: Aynı örnek üzerinde birden fazla SQL deyimi tanılarken dizin önerilerini konsolide edin. Örtüşen dizinleri, ortak ön eke sahip dizinleri ve gereksiz adayları belirleyerek minimal ve etkili bir dizin kümesi oluşturun.
Maliyet tabanlı ve kural tabanlı önerilerin karşılaştırılması
SQL optimizasyonu önerileri için kural tabanlı ve maliyet tabanlı olmak üzere iki yaklaşım bulunur. DAS, maliyet tabanlı yöntemi kullanır.
Kural tabanlı yöntem
Kural tabanlı yöntem, maliyeti değerlendirmeden aday dizinler oluşturmak için sabit kalıplar uygular. Şu tarz bir sorgu için:
SELECT *
FROM t1
WHERE time_created >= '2017-11-25'
AND consuming_time > 1000
ORDER BY consuming_time DESC;
Kural tabanlı yöntem, bunları sıralamanın bir yolu olmadan birden fazla aday üretir:
IX1(time_created)
IX2(time_created, consuming_time)
IX3(consuming_time)
IX4(consuming_time, time_created)
Sorgu tablo birleştirmeleri veya alt sorgular içeriyorsa belirsizlik daha da artar. Kural tabanlı yöntem, hangi dizinin yürütme maliyetini gerçekten azalttığını belirleyemez.
Maliyet tabanlı yöntem
Maliyet tabanlı yöntem, her adayı veritabanı istatistiklerine göre değerlendirir ve veritabanı iyileştiricisinin çalışma biçimine benzer şekilde en düşük hesaplanan maliyete sahip olanı seçer. Kapsamlı değerlendirmenin mümkün olmadığı deterministik olmayan polinom (NP) problemleri için motor, neredeyse optimal bir çözüm bulmak adına mümkün olduğunca çok adayı değerlendirir.
Bu yaklaşım, MySQL gibi açık kaynak veritabanlarının varsayılan olarak sahip olmadığı iki yetenek gerektirir:
WIT yeteneği: Hipotetik bir dizinin maliyetini onu oluşturmadan simüle etmek için gereklidir. DAS bunu veritabanı çekirdeğinden bağımsız olarak uygular.
İstatistikler: Yürütme planı maliyetlerini doğru hesaplamak için gereklidir. DAS istatistikleri otomatik olarak toplar ve önbelleğe alır.
Yetenek doğrulaması
Motorun öneri kalitesi, imza tabanlı bir test senaryosu kitaplığına karşı sürekli olarak ölçülür. Her test senaryosu; ilgili SQL deseni, şema, istatistikler ve ortam parametrelerinin parmak izi olan imzasıyla tanımlanır.

Test senaryoları, Alibaba Group'un dahili hizmetlerinde yürütülen SQL deyimlerinden alınır. İstatistiksel bilgiler dahil olmak üzere çıkarılan tüm veriler, otomatik bir süreç aracılığıyla şifrelenir ve maskelenir.
Kitaplık dört boyut üzerinden değerlendirilir:
İmza kapsamı: Kitaplıktaki hangi imzaların mevcut test senaryoları tarafından kapsandığı
Boşluk analizi: Henüz kapsanmamış olan veya SQL doğrulamasında başarısız olan imzalar
Gerileme takibi: Zaman içinde tekrarlayan hatalar gösteren imzalar
Yetenek seviyesine göre kapsam oranı
Bu geri bildirim döngüsü, motorun öneri doğruluğunu sürekli olarak iyileştirmeye yönelik çalışmaları yönlendirir.
Optimizasyon modları
Alibaba Cloud'da yayımlanmadan önce motor, Alibaba Group'un dahili hizmetlerinde yıllarca çalıştı ve günde ortalama yaklaşık 50.000 SQL deyimi tanıladı. DAS bu yeteneği iki modda sunar:
Özel optimizasyon: Tanılama için belirli SQL deyimlerini gönderin. Motor, tahmini performans iyileştirmesiyle birlikte dizin önerileri ve SQL yeniden yazma önerileri döndürür.
Otomatik optimizasyon: DAS, örnek iş yüklerini izler, yavaş sorguları belirler, bunları tanılar ve optimizasyon önerileri oluşturur. Her öneriyi doğruladıktan sonra DAS optimizasyonu zamanlar, çevrimiçi olarak uygular ve değişiklik sonrası performansı izler. Tüm süreç manuel müdahale olmadan çalışır.
Otomatik optimizasyondan kaynaklanan geri alma durumları, başarısız tanılama sonuçları ve kullanıcılar tarafından bildirilen sorunlar, gelecekteki önerileri iyileştirmek amacıyla otomatik olarak test senaryosu kitaplığına geri beslenir.
Desteklenen veritabanı motorları
Maliyet tabanlı SQL tanılama motoru aşağıdaki veritabanı motorlarını destekler:
ApsaraDB RDS for MySQL
PolarDB for MySQL
ApsaraDB RDS for PostgreSQL
PolarDB for PostgreSQL (Oracle ile uyumlu)
PolarDB for MySQL için motor ayrıca en uygun Bellek İçi Sütun Dizinlerini (IMCI) önerebilir. Ayrıntılar için bkz.
.