F.2. aqo — Maliyet Tabanlı Sorgu Optimizasyonu
aqo modülü, Postgres Pro Enterprise için maliyet tabanlı sorgu optimizasyonu uzantısıdır. Makine öğrenmesi yöntemlerini, daha spesifik olarak k-NN algoritmasının bir modifikasyonunu kullanarak, aqo satır sayısı tahminini iyileştirir, bu da daha iyi bir plan seçimine ve sonuç olarak sorguların hızlanmasına katkıda bulunabilir.
F.2.1. Açıklama
aqo modülü, sistem ilişkilerine erişen sorgular hariç tüm yürütülen sorgular için istatistik toplayabilir. Yalnızca sabitlerde farklılık gösteren sorgular aynı sınıfa ait kabul edilir. Her sınıf için aqo modülü, makine öğrenmesi için satır sayısı tahmininin kalitesini, planlama süresini, yürütme süresini ve istatistiklerini saklar. Bu verilere dayanarak, aqo yeni bir yürütme planı oluşturur ve bunu aynı sınıftaki bir sonraki sorgu için kullanır. Testlerde aqo, karmaşık sorgular için önemli bir performans artışı göstermiştir.
aqo modülü, tüm öğrenme verilerini (aqo_data), sorguları (aqo_query_texts), sorgu parametrelerini (aqo_queries) ve sorgu yürütme istatistiklerini (aqo_query_stat) dosyalarda saklar. aqo başlatıldığında, bu veriler paylaşılan belleğe yüklenir. aqo verilerine fonksiyonlar ve görünümler kullanarak erişebilirsiniz.
aqo.advanced parametresi etkinleştirildiğinde ve aqo intelligent veya learn modunda çalıştırıldığında, her sorgu sınıfına, sorgu ağacına dayalı olarak hesaplanan benzersiz bir hash değeri atanır; bu, onu tanımlamak ve toplanan istatistikleri ayırmak için kullanılır. aqo.advanced devre dışı bırakıldığında, izlenmeyen tüm sorgu sınıfları için istatistikler, hash'i 0 olan genel bir sorgu sınıfında saklanır.
Her sorgu sınıfı, o sorgu sınıfı için istatistiklerin toplandığı özellik alanı adı verilen ayrı bir alanla ilişkilidir. Özellik alanını tanımlamak için, aqo modülü sorgu ağacındaki her düğüm için özellikler (feature) oluşturur. Özellikler, düğümün türüne, ilişkilerine ve diğer özelliklerine bağlıdır. Örneğin, bir JOIN düğümü için özellikler, birleştirme türü, birleştirme koşulları ve birleştirilen tabloların boyutları gibi bilgileri içerebilir.
aqo modülü, k-NN (k-en yakın komşu) algoritmasının bir modifikasyonunu kullanarak, mevcut sorgu için özellik alanında en yakın öğrenme örneklerini bulur ve bunlara dayanarak satır sayısı tahminini yapar. Bu tahmin, sorgu planlayıcısı tarafından daha iyi bir plan seçmek için kullanılır.
F.2.2. Kurulum ve Hazırlık
aqo modülü Postgres Pro Enterprise ile birlikte gelir. Modülü kullanmak için aşağıdaki adımları izleyin:
- postgresql.conf dosyasında shared_preload_libraries parametresine aqo ekleyin:
shared_preload_libraries = 'aqo' - PostgreSQL sunucusunu yeniden başlatın
- aqo uzantısını veritabanında oluşturun:
CREATE EXTENSION aqo;
Uzantı, her veritabanında ayrı ayrı oluşturulmalıdır. Uzantıyı kullanmak istediğiniz her veritabanında CREATE EXTENSION komutunu çalıştırın.
<strong>Not:</strong> aqo modülü, makine öğrenmesi için veri toplamak üzere sorguları izler. Modülün düzgün çalışması için, pg_stat_statements veya pgpro_stats uzantısının yüklü olması önerilir.
F.2.3. Kullanım
aqo modülü etkinleştirildikten sonra, modül otomatik olarak sorguları izlemeye ve öğrenme verilerini toplamaya başlar. Modül, aqo.enable parametresi ile kontrol edilir.
F.2.3.1. Temel Kullanım
aqo'yu etkinleştirmek için:
SET aqo.enable = ON;
aqo'yu devre dışı bırakmak için:
SET aqo.enable = OFF;
F.2.3.2. Çalışma Modları
aqo modülü aşağıdaki çalışma modlarını destekler:
off— aqo devre dışıdırlearn— aqo öğrenme modunda çalışır ve veri toplar, ancak tahminleri kullanmazintelligent— aqo hem öğrenir hem de tahminleri kullanır
Çalışma modunu ayarlamak için:
SET aqo.mode = 'intelligent';F.2.4. Referans
Bu bölüm, aqo modülünün fonksiyonları, görünümleri ve yapılandırma parametreleri hakkında detaylı bilgi sağlar.
F.2.4.1. Yapılandırma Parametreleri
aqo modülü aşağıdaki yapılandırma parametrelerini destekler. Bu parametreler postgresql.conf dosyasında veya ALTER SYSTEM komutu ile ayarlanabilir:
| Parametre | Tip | Varsayılan | Açıklama |
|---|---|---|---|
aqo.enable |
boolean |
off |
aqo modülünü etkinleştirir/devre dışı bırakır |
aqo.mode |
enum |
'off' |
aqo çalışma modu: off, learn, intelligent |
aqo.advanced |
boolean |
off |
Gelişmiş modu etkinleştirir/devre dışı bırakır |
aqo.sandbox |
boolean |
off |
Sandbox modunu etkinleştirir/devre dışı bırakır |
aqo.knob |
integer |
5 |
k-NN algoritması için k değeri |
aqo.min_time |
integer |
1000 |
İzlenmesi gereken minimum sorgu süresi (milisaniye) |
aqo.use_aqo |
boolean |
true |
Belirli bir sorgu için aqo kullanımını kontrol eder |
aqo.join_threshold |
integer |
0 |
JOIN işlemleri için eşik değeri |
aqo.force_collect_stat |
boolean |
false |
İstatistik toplamayı zorla |
<strong>Not:</strong> Bu parametrelerin çoğu oturum düzeyinde veya sorgu düzeyinde ayarlanabilir. Bazı parametreler yalnızca sunucu başlatılırken ayarlanabilir.
F.2.4.2. Görünümler
aqo modülü aşağıdaki görünümleri sağlar:
aqo_data
Makine öğrenmesi için toplanan verileri içerir.
aqo_query_texts
İzlenen sorguların metinlerini içerir.
aqo_queries
Sorgu parametrelerini içerir.
aqo_query_stat
Sorgu yürütme istatistiklerini içerir.
F.2.4.3. Fonksiyonlar
aqo modülü aşağıdaki fonksiyonları sağlar:
aqo_reset
aqo_reset() returns void
aqo verilerini sıfırlar. Sandbox modu etkinse, yalnızca sandbox verilerini sıfırlar.
aqo_data_update
aqo_data_update(fs bigint, fss bigint, dbid oid, delta_rows bigint, nfeatures integer, features integer[], targets numeric[], reliability numeric[], oids oid[], tmpoids oid[]) returns void
aqo verilerini günceller.
<strong>Parametreler:</strong>
- <code>fs</code> — Özellik alanı hash değeri
- <code>fss</code> — Özellik alanı alt hash değeri
- <code>dbid</code> — Veritabanı OID
- <code>delta_rows</code> — Satır sayısı farkı
- <code>nfeatures</code> — Özellik sayısı
- <code>features</code> — Özellik dizisi
- <code>targets</code> — Hedef değerler dizisi
- <code>reliability</code> — Güvenilirlik değerleri dizisi
- <code>oids</code> — İlişki OID'leri dizisi
- <code>tmpoids</code> — Geçici ilişki OID'leri dizisi
F.2.5. Örnekler
Aşağıda aqo modülünün kullanımına ilişkin örnekler verilmiştir:
F.2.5.1. Temel Örnek
-- aqo'yu etkinleştir
SET aqo.enable = ON;
SET aqo.mode = 'intelligent';
-- Bir sorgu çalıştır
EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT * FROM mytable WHERE id = 100;
-- aqo öğrenme verilerini görüntüle
SELECT * FROM aqo_data LIMIT 10;
F.2.5.2. Sandbox Modu Kullanımı
Sandbox modu, aqo verilerini ana verileri etkilemeden test etmenize olanak tanır. Sandbox modunda toplanan veriler, sandbox modu kapatıldığında ana verilere aktarılabilir.
SET aqo.sandbox = ON;
SET aqo.enable = ON;
SET aqo.advanced = OFF;
-- Sandbox veritabanı bilgisini temizle, ana verileri etkilemeden
SELECT aqo_reset();
EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT t.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
JOIN tickets t ON t.ticket_no = tf.ticket_no
WHERE f.scheduled_departure > '2017-08-15 15:00:00+00';
-- Sandbox'tan aqo.advanced = OFF ile elde edilen verileri kopyala
CREATE TABLE aqo_data_sandbox AS SELECT * FROM aqo_data;
SET aqo.sandbox = OFF;
SELECT aqo_data_update (fs, fss, dbid, delta_rows, nfeatures, features, targets, reliability, oids, tmpoids)
FROM aqo_data_sandbox WHERE fs = 0;
DROP TABLE aqo_data_sandbox;
F.2.5.3. Gelişmiş Örnek
Aşağıda, aqo'nun karmaşık bir sorgu için nasıl çalıştığını gösteren bir örnek verilmiştir:
-- aqo'yu etkinleştir ve intelligent modunu kullan
SET aqo.enable = ON;
SET aqo.mode = 'intelligent';
SET aqo.advanced = ON;
-- İlk sorgu çalıştırma - aqo öğrenmeye başlar
EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT t.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
JOIN tickets t ON t.ticket_no = tf.ticket_no
WHERE f.scheduled_departure > '2017-08-15 15:00:00+00';
-- İkinci sorgu çalıştırma - aqo tahminleri kullanır
EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT t.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
JOIN tickets t ON t.ticket_no = tf.ticket_no
WHERE f.scheduled_departure > '2017-08-15 15:00:00+00';
-- aqo verilerini görüntüle
SELECT * FROM aqo_data WHERE fs != 0 LIMIT 10;
SELECT * FROM aqo_query_texts LIMIT 5;
SELECT * FROM aqo_queries LIMIT 5;
SELECT * FROM aqo_query_stat LIMIT 5;
<strong>Not:</strong> EXPLAIN çıktısında, aqo kullanılan düğümler için 'AQO: rows=X, error=Y%, fss=Z' bilgisi görüntülenir. Bu bilgi, aqo'nun tahminlerinin ne kadar doğru olduğunu gösterir.
F.2.6. Yazar
aqo modülü Oleg Ivanov tarafından geliştirilmiştir.