From f537add5734ee28f4997e0652b8813737ed7341b Mon Sep 17 00:00:00 2001 From: Daan Meijer Date: Wed, 4 Nov 2026 09:31:06 +0100 Subject: [PATCH] Twins by content: type the hash as the column jsonb_to_recordset declared hash16k as text; against the char(32) column the join cast the column, so Postgres scanned all of file_hashes for every call (4 s, 20 calls a minute: 44% of the database's time). Declared char(32), the join walks file_hashes_hash_size_release_idx: 24 ms for 300 pairs. LOG.md (138). Co-Authored-By: Claude Fable 5.1 --- app/services/hash_twins.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/services/hash_twins.ts b/app/services/hash_twins.ts index 0254703..701d023 100644 --- a/app/services/hash_twins.ts +++ b/app/services/hash_twins.ts @@ -11,9 +11,11 @@ export async function twinNames( ): Promise> { const out = new Map() if (pairs.length === 0) return out + // hash16k typed as the column (char(32)): as text the join cast the column and scanned all of file_hashes + // instead of file_hashes_hash_size_release_idx, 4 s a call (LOG.md (138)). const { rows } = await trx.rawQuery( `SELECT DISTINCT ON (h.hash16k, h.size) h.hash16k, h.size, coalesce(r.inner_name, r.name) AS name - FROM jsonb_to_recordset(?::jsonb) AS v(hash16k text, size bigint) + FROM jsonb_to_recordset(?::jsonb) AS v(hash16k char(32), size bigint) JOIN file_hashes h ON h.hash16k = v.hash16k AND h.size = v.size JOIN releases r ON r.id = h.release_id AND (r.readable OR r.inner_name IS NOT NULL) WHERE NOT EXISTS (SELECT 1 FROM release_verdicts x WHERE x.release_id = r.id)