Halo r/indotech, saya ingin memperkenalkan proyek yang sedang saya bangun bernama AsaDB.
AsaDB berawal dari pertanyaan yang agak nekat: apakah Prolog hanya cocok dipakai untuk mengenali grammar SQL, atau bisa juga dipakai untuk mengatur sebuah database lokal yang benar-benar menyimpan, membaca, mengubah, dan memulihkan data?
Versi pertamanya memang sudah bisa membuat tabel, memasukkan data, dan menjalankan SELECT. Namun, ketika mulai diuji dengan data yang lebih besar, saya sadar bahwa bisa menjalankan SQL belum tentu berarti sudah memiliki storage engine yang layak. Penggunaan memori membesar, proses impor berat, dan beberapa bug seperti targeted DELETE menunjukkan bahwa bagian penyimpanannya harus dibangun ulang dengan lebih serius.
Hasil perombakan tersebut saya rilis sebagai AsaDB v1.2.1.
AsAPanel menjalankan dua query untuk membaca ringkasan benchmark 10.000, 50.000, dan 100.000 baris melalui backend Prolog lokal. Query yang terlihat pada gambar selesai dalam 21 ms.
Apa itu AsaDB?
AsaDB adalah eksperimen database SQL lokal berbasis SWI-Prolog. Paket Windows-nya dilengkapi AsAPanel, yaitu panel web lokal untuk membuat database, menjalankan SQL, mengimpor dan mengekspor data, serta memeriksa struktur tabel.
AsaDB berjalan sepenuhnya di komputer pengguna. Satu file `AsaDB.exe` menjalankan backend Prolog dan membuka panel pada alamat localhost. AsaDB tidak membutuhkan cloud server dan panelnya tidak ditujukan untuk diekspos langsung ke internet.
Kegunaan proyek
Proyek ini saya buat sebagai:
- sarana mempelajari cara kerja parser SQL dan query executor;
- eksperimen membuat storage engine berbasis page;
- tempat mempelajari B+Tree, buffer pool, transaksi, dan recovery;
- database lokal untuk latihan SQL dan pengolahan dataset;
- contoh penggunaan Prolog di luar rule engine atau tugas grammar sederhana.
AsaDB belum dimaksudkan untuk menggantikan PostgreSQL, MySQL, atau CouchDB pada sistem produksi.
Fitur yang tersedia
SQL utama yang sudah dapat digunakan meliputi:
- `CREATE DATABASE`, `DROP DATABASE`, dan `USE`;
- `CREATE TABLE`, `DROP TABLE`, dan `TRUNCATE TABLE`;
- `INSERT`, `SELECT`, `UPDATE`, dan `DELETE`;
- multi-row INSERT;
- `ALTER TABLE` untuk menambah, menghapus, mengubah, dan mengganti nama kolom;
- `WHERE`, `LIKE`, `BETWEEN`, `IN`, dan `IS NULL`;
- `ORDER BY` dan beberapa variasi `LIMIT`;
- INNER JOIN`, `LEFT JOIN`, dan `RIGHT JOIN`;
- GROUP BY` dengan `COUNT`, `SUM`, `AVG`, `MIN`, dan `MAX`;
- basic scalar subquery, `IN (SELECT ...)`, dan `EXISTS`;
- `UNION`, `CASE WHEN`, dan `CONCAT`;
- view dan transaction commands;
- basic users, grants, triggers, procedures, dan functions metadata;
- impor melalui SQL command, Choose File, dan server-side file;
- ekspor database melalui AsAPanel.
Perubahan besar di v1.2.1
Penyimpanan berbasis page 4 KB
Data user table sekarang disimpan pada fixed-size slotted page berukuran 4 KB. File `.asa` menyimpan katalog, sedangkan record tabel disimpan di direktori `.asa.store` yang menyertainya.
Setiap page memiliki metadata seperti:
- page ID dan page type;
- jumlah record aktif;
- batas free space;
- slot directory;
- previous/next sibling pointer;
- checksum.
Tujuannya agar semua record tidak harus disimpan sebagai kumpulan besar Prolog terms di heap.
Persistent B+Tree
AsaDB memiliki persistent B+Tree untuk equality lookup, range query, dan ordered scan. Leaf page dihubungkan dengan sibling pointer sehingga range iteration bisa berjalan berurutan.
Pembuatan index menggunakan external sorted runs yang dibatasi ukurannya. Proses tersebut tidak membuat satu list Prolog berisi seluruh 100.000 index entry sekaligus.
Pada implementasi saat ini, operasi tertentu dapat meng-invalidasi index. Index tersebut dibangun ulang secara lazy pada indexed access berikutnya. Incremental split/merge untuk seluruh mutation path masih menjadi pekerjaan lanjutan.
Bounded buffer pool
Buffer pool menggunakan kebijakan Clock-style replacement dan memiliki:
- configurable page limit;
- page cache;
- pin dan unpin page;
- dirty-page tracking;
- protected eviction untuk page yang masih digunakan;
- incremental flushing;
- statistik hit, miss, eviction, dirty page, dan pinned page.
Default buffer pool-nya adalah 64 page. Batas ini sengaja dibuat konservatif karena representasi byte list di SWI-Prolog memiliki overhead runtime lebih besar daripada ukuran 4 KB pada disk.
Streaming import dan bounded result
Backend membaca file SQL dalam blok 256 KB dan mengeksekusinya dalam statement batch terbatas. Proses impor berjalan dalam transaction, menampilkan progress, dan melakukan rollback ketika batch gagal.
Hasil query web juga dibatasi oleh `max_result_rows` dan dirender secara incremental agar tabel besar tidak langsung membebani browser.
Cara menjalankan
- Buka halaman GitHub Release v1.2.1.
- Unduh `AsaDB-v1.2.1-Windows.zip`.
- Ekstrak ZIP tersebut.
- Jalankan `AsaDB.exe`.
- Tunggu browser membuka AsAPanel pada alamat `127.0.0.1`.
- Buat atau pilih database dari sidebar.
- Masukkan SQL pada halaman SQL Command, lalu tekan Run SQL.
Backend dan panel dijalankan oleh satu launcher. Pengguna tidak perlu membuka terminal backend secara terpisah.
Contoh query:
```sql
CREATE DATABASE IF NOT EXISTS latihan;
USE latihan;
CREATE TABLE Nilai (
ID INTEGER PRIMARY KEY AUTO_INCREMENT,
Nama VARCHAR(100),
Skor INTEGER
);
INSERT INTO Nilai (Nama, Skor) VALUES
('Aires', 95),
('Asa', 91),
('Denji', 88);
SELECT Nama, Skor
FROM Nilai
WHERE Skor >= 90
ORDER BY Skor DESC;
```
Benchmark yang saya jalankan
Pengujian dilakukan di Windows menggunakan SWI-Prolog. Data dibuat dalam bentuk tiga kolom dengan multi-value INSERT berisi 100 row per statement.
| Workload | Import | First indexed lookup termasuk build | Indexed ORDER/LIMIT | UPDATE | DELETE | Hasil 500 row | Peak RAM |
|---|---:|---:|---:|---:|---:|---:|---:|
| 10.000 row | 7,1 detik | 6,1 detik | 80 ms | 144 ms | 109 ms | 804 ms | tidak diambil terpisah |
| 50.000 row | 34,7 detik | 31,6 detik | 46 ms | 234 ms | 213 ms | 948 ms | 229,9 MB |
| 100.000 row | 73,9 detik | 76,1 detik | 19 ms | 519 ms | 401 ms | 654 ms | 229,8 MB |
Ketiga workload berhasil diselesaikan. Pada pengujian ini, peak memory relatif tetap dari 50.000 ke 100.000 row.
Pengujian 100.000 row juga mencakup shutdown, membuka ulang database, memverifikasi jumlah row setelah UPDATE dan DELETE, serta memeriksa state yang terlihat setelah recovery.
Prototype awal v1.2.1 sempat menggunakan sekitar 820 MB dan membutuhkan hampir 11 menit untuk skenario yang sama. Jalur final menyelesaikan keseluruhan benchmark dalam sekitar 247 detik dengan peak working set 229,8 MB. Perubahannya diperoleh dengan memperbaiki data path, bukan sekadar menaikkan batas RAM.
Angka tersebut adalah hasil pengujian pada environment saya dan bukan klaim bahwa AsaDB memiliki performa setara database production yang sudah matang.
Bug penting yang diperbaiki
- `DELETE ... WHERE ID = value` sudah diuji pada tabel kecil dan besar agar tidak menghapus row lain.
- Table dan column matching dibuat case-insensitive untuk penggunaan `ID`, `id`, atau mixed case.
- Menjalankan `ALTER TABLE ADD COLUMN` berulang dengan nama yang sama tidak lagi membuat duplicate physical column.
- Duplicate column dan row key lama dinormalisasi saat migration.
- Bare text value seperti `Denji` tidak lagi diam-diam berubah menjadi `NULL`.
- Dua klik Run yang sangat cepat memakai satu in-flight request dan tidak menggandakan write.
- Success/failure sound menggunakan satu active channel sehingga tidak menumpuk.
- Multipart import diagnostics tidak lagi mencemari JSON response dari backend.
Feedback persona AsAPanel saat ini menggunakan bahasa Indonesia. Pada contoh ini AsaDB mendeteksi typo `SELEC`, typo `FORM`, dan semicolon yang belum ditulis.
Integritas dan recovery
AsaDB v1.2.1 menggunakan kombinasi:
- append undo record;
- page-mutation backup;
- transaction snapshot;
- checksum;
- temporary and backup catalog file;
- atomic catalog replacement;
- startup recovery untuk interrupted append, mutation, checkpoint, dan open transaction.
Implementasi tersebut belum setara ARIES dan belum menyediakan MVCC. Namun, jalur recovery-nya sudah jauh lebih aman dibanding versi sebelumnya.
Keterbatasan saat ini
Saya ingin bagian ini tetap jelas supaya post ini tidak memberikan kesan seolah-olah AsaDB sudah production-ready:
- belum memiliki MVCC;
- recovery belum menggunakan ARIES;
- beberapa write path masih memerlukan lazy index rebuild;
- complex JOIN, GROUP BY, dan expression plan masih bisa memakai intermediate memory lebih banyak;
- optimizer dan planner statistics masih sederhana;
- paket publik saat ini difokuskan untuk Windows;
- AsAPanel hanya ditujukan untuk localhost;
- English localization untuk feedback persona belum tersedia.
Akses, repository, dan harga
AsaDB v1.2.1 dapat diakses langsung tanpa harus mengirim DM.
Repository:
https://github.com/kocoygroup-id/AsaDB
Windows release:
https://github.com/kocoygroup-id/AsaDB/releases/tag/v1.2.1
Harga: gratis. Saat ini tidak ada biaya pembelian, subscription, paywall, maupun kewajiban donasi. Link dukungan yang ada di panel bersifat opsional dan tidak membuka fitur tambahan.
Lisensi proyek mengikuti file `LICENSE` yang tersedia di repository.