From c3e7f49be32552de6a575cd9187b5062209e280e Mon Sep 17 00:00:00 2001 From: Sloe <217871463+sloemo01@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:05:34 +0530 Subject: [PATCH] fix(web): use CROSS JOIN to stop vector_top_k being evaluated per-row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit searchKind() combined vector_top_k() with an INNER JOIN on memories, and when a container_tag filter was present SQLite's planner drove from the memories table (using idx_container_tag) and evaluated the vector_top_k virtual table once per memory row — turning a single ANN lookup into N nested-loop evaluations. On a 337-row shard this made memory search take ~8s (7982/8113/8064ms) instead of tens of milliseconds, causing the Web UI to abort the fetch. Changing the JOIN to CROSS JOIN forces the intended TVF-first plan (SCAN v VIRTUAL TABLE -> SEARCH m USING INTEGER PRIMARY KEY), which the issue reporter benchmarked at ~28ms. The WHERE filters on m. IS NOT NULL and m.container_tag still apply, so semantics are unchanged. Fixes #247 --- src/services/turso/vector-search.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/turso/vector-search.ts b/src/services/turso/vector-search.ts index b562caf..8e975e8 100644 --- a/src/services/turso/vector-search.ts +++ b/src/services/turso/vector-search.ts @@ -236,13 +236,13 @@ export class TursoVectorSearch { ? ` SELECT m.id AS id, vector_distance_cos(m.${columnName}, vector32(?)) AS dist FROM vector_top_k('${indexName}', vector32(?), ?) AS v - JOIN memories m ON m.rowid = v.id + CROSS JOIN memories m ON m.rowid = v.id WHERE m.${columnName} IS NOT NULL ` : ` SELECT m.id AS id, vector_distance_cos(m.${columnName}, vector32(?)) AS dist FROM vector_top_k('${indexName}', vector32(?), ?) AS v - JOIN memories m ON m.rowid = v.id + CROSS JOIN memories m ON m.rowid = v.id WHERE m.${columnName} IS NOT NULL AND m.container_tag = ? `, containerTag === "" ? [queryJson, queryJson, k] : [queryJson, queryJson, k, containerTag]