2 poin oleh GN⁺ 2025-04-29 | Belum ada komentar. | Bagikan ke WhatsApp
  • Mesin SQL adalah lapisan logis database yang bekerja di antara klien dan penyimpanan
  • Penjelasan rinci tentang proses utama mesin SQL: parsing, binding, penyederhanaan plan, eksplorasi join dan evaluasi biaya, eksekusi, dan spooling hasil
    • Parsing mengubah kueri SQL menjadi abstract syntax tree (AST) yang terstruktur
    • Binding mencocokkan field dalam AST dengan simbol di katalog database saat ini
    • Penyederhanaan plan menormalkan sintaks SQL yang kompleks menjadi bentuk yang lebih sederhana untuk meningkatkan kecepatan eksekusi
    • Eksplorasi plan menelusuri berbagai variasi join, agregasi, dan window function untuk menemukan plan eksekusi terbaik
    • Eksekusi dan spooling hasil mengubah plan akhir ke bentuk yang dapat dieksekusi dan mengembalikan hasil ke klien

Gambaran umum mesin SQL

  • Mesin SQL adalah lapisan perantara logis antara permintaan klien dan penyimpanan data
  • Tahap utama
    • Parsing: mengubah kueri menjadi AST (abstract syntax tree)
    • Binding: menghubungkan identifier dalam AST ke simbol di katalog database
    • Plan Simplification: menyederhanakan beragam sintaks SQL menjadi bentuk plan yang terstandarisasi
    • Join Exploration & Costing: menelusuri berbagai urutan join dan mengevaluasi biayanya
    • Execution: menjalankan kueri menggunakan plan eksekusi terbaik
    • Spooling Results: mengembalikan hasil ke klien

Parsing

  • Parsing adalah proses melakukan tokenisasi kueri input dan mengubahnya menjadi AST
  • Parser rekursif kanan mudah dipahami dan di-debug, tetapi menggunakan banyak memori stack
  • Parser rekursif kiri (berbasis Yacc) lebih efisien secara memori, tetapi memerlukan logika yang lebih kompleks
  • Dolt menggunakan parser rekursif kiri untuk mendukung parsing yang cepat
  • Jika parsing berhasil, struktur AST akan sesuai dengan aturan Yacc

Binding

  • Binding adalah proses menghubungkan field dalam AST ke simbol tabel dan kolom yang sebenarnya di database
  • Konsep utama
    • Definisi tabel: berperan sebagai sumber data
    • Definisi kolom: merujuk ke kolom tertentu dari sumber tabel
    • Alias: menggunakan nilai skalar baik sebagai sumber maupun sebagai sink
    • Subkueri skalar: berbagi scope induk sambil melakukan name binding
  • Hasil binding adalah pembuatan node plan eksekusi dalam format sql.Node

Penyederhanaan plan

  • Proses mengubah berbagai ekspresi SQL menjadi bentuk ternormalisasi untuk membantu optimasi eksekusi
  • Optimasi yang umum
    • Filter Pushdown: menghapus baris yang tidak diperlukan
    • Column Pruning: menghapus kolom yang tidak diperlukan
  • Optimasi plan join juga dilakukan melalui transformasi seperti subquery decorrelation

Type coercion

  • Type coercion adalah proses mengubah tipe ekspresi secara otomatis sesuai konteks
  • Tipe dapat berubah tergantung konteks seperti WHERE, INSERT, dan lainnya
  • Dolt menangani konversi tipe secara bertahap pada tahap binding

Eksplorasi join

  • Eksplorasi join adalah proses menghasilkan dan meninjau berbagai urutan join
  • Dua strategi eksplorasi
    • Backtracking top-down: hanya menelusuri urutan join yang valid
    • Dynamic programming (DP) bottom-up: mencoba semua kombinasi untuk menemukan urutan join optimal
  • Menggunakan struktur Memo untuk mengelola status perantara secara efisien

Functional dependencies

  • Biaya dapat meningkat tajam saat melakukan join pada 5 tabel atau lebih
  • Biaya eksplorasi dapat dikurangi dengan memanfaatkan relasi 1:1, seperti join berbasis primary key (PK)
  • Optimasi dilakukan dengan terlebih dahulu memprioritaskan LOOKUP_JOIN

Ringkasan intermediate representation (IR)

  • Ringkasan 3 tahap IR yang telah dibahas sejauh ini
    • AST: penataan token
    • Binding berbasis scope: validasi referensi kolom
    • Memo: representasi untuk eksplorasi join dan evaluasi biaya

Evaluasi biaya join

  • Evaluasi biaya join adalah proses memperkirakan biaya eksekusi untuk semua plan yang mungkin
  • Faktor biaya
    • Ukuran tabel input
    • Ukuran tabel hasil
    • Jenis operator join (LOOKUP_JOIN, HASH_JOIN, dll.)
  • Dolt mengevaluasi biaya berdasarkan statistik tabel yang akurat (histogram)

Join hints

  • Sistem mencoba menerapkan strategi join terlebih dahulu berdasarkan hint yang diberikan pengguna
  • Hint yang saling bertentangan atau tidak tepat akan diabaikan

Eksekusi

  • Plan terbaik diubah menjadi struktur iterator (Volcano Iterator) yang benar-benar dapat dieksekusi
  • Karakteristik
    • Iterator non-materializing: langsung mengembalikan baris
    • Iterator materializing: mengumpulkan semua baris lalu mengembalikannya
  • Referensi kolom dipetakan berdasarkan offset indeks sebelum eksekusi

I/O dan spooling hasil

  • Hasil eksekusi diubah ke format protokol MySQL lalu dikirim ke klien
  • Dalam beberapa kasus, hasil dibaca langsung dari lapisan penyimpanan key-value (KV) untuk optimasi
  • Pemrosesan batch dan penggunaan ulang buffer meningkatkan kecepatan pemrosesan dan efisiensi memori

Rencana ke depan

  • Dolt pada dasarnya menggunakan eksekusi berbasis baris (row-based execution) di server lokal
  • Dolt mendukung penyusunan plan eksekusi optimal dengan memanfaatkan 3 tahap intermediate representation (IR) seperti AST, binding berbasis scope, dan eksplorasi join melalui struktur Memo
  • Strategi join optimal ditentukan melalui Join Search dan Join Costing
  • Ke depan, peningkatan performa direncanakan melalui integrasi IR dan optimasi penggunaan ulang memori

Belum ada komentar.

Belum ada komentar.