SPB Git

spb/vrai-prix

Public

Vrai-Prix — l'évaluation du vrai prix des propriétés résidentielles au Québec.

fix(db): index NOCASE municipalité + index partiel ventes récentes — panne 2026-08-25

municipalityCenter/municipalityPercentile faisaient un SCAN des 3,7 M
d'unités à chaque page d'estimation (COLLATE NOCASE ≠ idx_units_mun
BINARY) ; recentSales scannait 750 k transactions avec tri temporaire.
Sous trafic crawlers, better-sqlite3 (synchrone) gelait l'event loop :
next-server à 100 % CPU pendant 10 h, port 8090 muet, site down.

Index créés sur la base live + bootstrap CREATE INDEX IF NOT EXISTS
dans getDb() pour survivre à une reconstruction de la base.
Requêtes vérifiées : covering index, pages < 0,32 s sous 20 req
parallèles (avant : plusieurs secondes chacune, empilement infini).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Aug 25, 2026) parent dc619be Browse files

1 changed file +12 −0

Unified Split
modified src/lib/db.ts +12 −0
@@ -10,6 +10,18 @@ export function getDb(): Database.Database {
10 process.env.VRAIPRIX_DB ?? path.join(process.cwd(), "data", "vraiprix.db"); 10 process.env.VRAIPRIX_DB ?? path.join(process.cwd(), "data", "vraiprix.db");
11 db = new Database(p, { fileMustExist: true }); 11 db = new Database(p, { fileMustExist: true });
12 db.pragma("journal_mode = WAL"); 12 db.pragma("journal_mode = WAL");
13+ // Index requis par les requêtes ci-dessous (COLLATE NOCASE : l'index BINARY
14+ // idx_units_mun est inutilisable → scan de 3,7 M de lignes qui gelait
15+ // l'event loop sous trafic, panne du 2026-08-25). No-op si déjà présents.
16+ db.exec(`
17+ CREATE INDEX IF NOT EXISTS idx_units_mun_nocase_geo
18+ ON units(municipalite COLLATE NOCASE, lat, lng);
19+ CREATE INDEX IF NOT EXISTS idx_units_mun_nocase_est
20+ ON units(municipalite COLLATE NOCASE, est_2026);
21+ CREATE INDEX IF NOT EXISTS idx_tx_recent
22+ ON transactions(date DESC, amount DESC)
23+ WHERE id_provinc IS NOT NULL AND street IS NOT NULL AND amount >= 50000;
24+ `);
13 } 25 }
14 return db; 26 return db;
15 } 27 }
16 28
Menu

Theme