// Sorgu yolundaki ifade indexi + WAL bakımı. Bir kez çalıştırılır // (pnpm tsx scripts/db-index.ts); ingest/refresh sonrası da güvenle // tekrar çalıştırılabilir (IF NOT EXISTS). // // src/lib/db.ts tüm aralık sorgularını COALESCE(sira2025, sira2024) // üzerinden yapar; SQLite ifade indexleri METİNSEL eşleştiği için buradaki // ifade oradaki EFEKTIF_SIRA sabitiyle birebir aynı olmalıdır. Bu index // olmadan her sorgu tur-partisyonunu tarayıp temp B-tree ile sıralıyordu. import path from "node:path"; import Database from "better-sqlite3"; const db = new Database(path.join(process.cwd(), "data", "yokatlas.db")); db.exec(` CREATE INDEX IF NOT EXISTS idx_programs_tur_onlisans_efektif ON programs (tur, onlisans, COALESCE(sira2025, sira2024)); `); // Uygulama DB'yi readonly açtığı için checkpoint yapamaz; şişen WAL'i // (okuma başına ekstra maliyet) burada dosyaya geri yaz ve sıfırla. db.pragma("wal_checkpoint(TRUNCATE)"); const plan = db .prepare( `EXPLAIN QUERY PLAN SELECT id FROM programs WHERE tur = ? AND onlisans = ? AND COALESCE(sira2025, sira2024) IS NOT NULL AND COALESCE(sira2025, sira2024) BETWEEN ? AND ? ORDER BY COALESCE(sira2025, sira2024) ASC LIMIT 10`, ) .all("SAYISAL", 0, 1000, 50000); console.log("Sorgu planı:", JSON.stringify(plan, null, 2)); db.close();