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:

  1. postgresql.conf dosyasında shared_preload_libraries parametresine aqo ekleyin:
    shared_preload_libraries = 'aqo'
  2. PostgreSQL sunucusunu yeniden başlatın
  3. 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ır
  • learn — aqo öğrenme modunda çalışır ve veri toplar, ancak tahminleri kullanmaz
  • intelligent — 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.