From bb4046bb1e0aafb977b444b57dc9d8ec59cc90fd Mon Sep 17 00:00:00 2001 From: Rene Fichtmueller Date: Sat, 6 Jun 2026 21:39:57 +0000 Subject: [PATCH] fix(reorder-signals): delete-before-insert prevents unbounded table growth MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reorder_signals grew to 4.49M rows / 1.19GB — the compute job INSERTed a fresh row per transceiver every 4h run but never deleted old ones (24h TTL filtered them at read time via DISTINCT ON + expires_at, but they were never purged). 4.37M rows were already expired dead weight. Fix: DELETE existing rows for a transceiver before inserting its new signal, so the table holds exactly one (latest) row per transceiver. Cleaned up to 18,175 rows / 4.5MB (99.6% reclaimed, VACUUM FULL). Backup: reorder_signals_keep_bak_20260606. Verified: re-running compute:reorder-signals keeps count stable at 18,175. --- packages/scraper/src/scrapers/market-intelligence.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/scraper/src/scrapers/market-intelligence.ts b/packages/scraper/src/scrapers/market-intelligence.ts index 3e67c06..1972c2d 100644 --- a/packages/scraper/src/scrapers/market-intelligence.ts +++ b/packages/scraper/src/scrapers/market-intelligence.ts @@ -279,6 +279,9 @@ export async function computeReorderSignals(): Promise { if (reasons.length === 0) reasons.push("Insufficient data for strong signal"); + // Keep exactly one (latest) signal per transceiver — delete prior rows first. + // Without this the table grew to 4.5M rows (24h-TTL never cleaned up old runs). + await pool.query(`DELETE FROM reorder_signals WHERE transceiver_id = $1`, [row.id]); await pool.query( `INSERT INTO reorder_signals (transceiver_id, signal, signal_strength, reasons, stock_trend, price_trend, lead_time_weeks)