# Informe de optimizacion de busqueda textual Generado: 2026-07-12T23:05:19.481Z ## 1. Problema encontrado Las consultas `query_06` y `query_07` evaluan la busqueda textual de `marcapasos` combinando busqueda FTS sobre `search_text` con condiciones `ILIKE '%marcapasos%'` sobre `registro_sanitario`, `expediente`, `producto`, `categoria_canonica` y `categoria_linea`. Antes de optimizar, PostgreSQL eligio `Parallel Seq Scan`, por lo que recorrio la tabla completa y aplico el filtro despues de leer cientos de miles de bloques. ## 2. Plan SQL anterior - query_06: Limit, Incremental Sort, Gather Merge, Index Scan; Seq Scan=0; bloques leidos=534.792; bloques hit=131.732; filas removidas=183.095; ejecucion=14.730,796 ms. - query_07: Aggregate, Bitmap Heap Scan, BitmapOr, Bitmap Index Scan; Seq Scan=0; bloques leidos=2.706; bloques hit=476; filas removidas=0; ejecucion=175,02 ms. ## 3. Cambios implementados Se mantuvo intacta la semantica de las consultas. La migracion agrega indices GIN trigram de expresion sobre los mismos `COALESCE(..., '')` usados por los predicados `ILIKE`, elimina el indice de orden de benchmark si estaba invalido y aumenta estadisticas de columnas de busqueda. `ANALYZE` se dejo como accion manual porque en esta base local falla por bytes con codificacion invalida en datos existentes. ## 4. Indices nuevos | Indice | Tamano | Valido | Listo | |---|---:|---|---| | `idx_bench_catalog_producto_coalesce_trgm` | 130 MB | true | true | | `idx_bench_catalog_registro_coalesce_trgm` | 42 MB | true | true | | `idx_bench_catalog_categoria_linea_coalesce_trgm` | 29 MB | true | true | | `idx_bench_catalog_categoria_canonica_coalesce_trgm` | 28 MB | true | true | | `idx_bench_catalog_expediente_coalesce_trgm` | 26 MB | true | true | ## 5. Validacion funcional - Conteo antes: 430. - Conteo despues: 430. - Faltantes: 0. - Adicionales: 0. - Duplicados despues: 0. - Cambio de orden: false. - Cambio de claves ORDER BY: false. - Nota de orden: Sin observaciones - Resultado: VALIDO, sin diferencias funcionales. ## 6. Resultados antes y despues - query_06: promedio 56,6463 ms -> 17,6873 ms (mejora 38,959 ms, 68,7759 %); p95 62,8487 ms -> 18,4071 ms (mejora 44,4416 ms, 70,712 %). - query_07: promedio 55,0169 ms -> 35,5003 ms (mejora 19,5166 ms, 35,4738 %); p95 59,4553 ms -> 59,7619 ms (mejora -0,3066 ms, -0,5157 %). ## 7. Plan SQL posterior - query_06: Limit, Bitmap Heap Scan, BitmapOr, Bitmap Index Scan, Sort, CTE Scan; Seq Scan=0; Bitmap=8; bloques leidos=0; bloques hit=5.104; ejecucion=18,424 ms. - query_07: Aggregate, Bitmap Heap Scan, BitmapOr, Bitmap Index Scan; Seq Scan=0; Bitmap=8; bloques leidos=0; bloques hit=3.182; ejecucion=15,557 ms. ## 8. Criterios - query_06: Cumple objetivo textual. Objetivo: promedio <= 3 s, p95 <= 5 s, ideal < 1 s. - query_07: Cumple objetivo de conteo. Objetivo: promedio <= 5 s, p95 <= 8 s. ## 9. Riesgos e impacto Los indices GIN adicionales consumen espacio y pueden aumentar el costo de futuras inserciones o actualizaciones en columnas textuales. No modifican datos regulatorios ni cambian resultados. El conteo exacto sigue evaluando todo el conjunto de coincidencias; si no cumple el objetivo, la siguiente alternativa es reescribir la busqueda como `UNION`/deduplicacion exacta o separar el conteo exacto como operacion diferida sin cambiar la ruta que lo obtiene. ## 10. Reversion y repeticion Revertir: ```powershell npm.cmd run benchmark:rollback ``` Repetir pruebas: ```powershell $env:BENCHMARK_QUERY_IDS="query_06,query_07" $env:BENCHMARK_REPETITIONS="100" $env:BENCHMARK_WARMUPS="5" npm.cmd run benchmark:optimized node benchmarks/scripts/validate-search-results.js after npm.cmd run benchmark:search:report ``` EA, MSE, precision y exhaustividad no calculables por ausencia de un conjunto de referencia validado.