-- Optimizaciones reversibles para busqueda textual INVIMA. -- Ejecutar con: npm run benchmark:optimize -- No modifica datos regulatorios; solo agrega extension/indices y estadisticas. -- CREATE INDEX CONCURRENTLY no puede ejecutarse dentro de una transaccion explicita. CREATE EXTENSION IF NOT EXISTS pg_trgm; -- Corrige una posible ejecucion anterior interrumpida: IF NOT EXISTS no repara indices invalidos. -- Se revierte eliminando los indices en optimization_down.sql. DROP INDEX CONCURRENTLY IF EXISTS idx_bench_catalog_order; DROP INDEX CONCURRENTLY IF EXISTS idx_bench_catalog_order_prefix; -- No se crea indice B-tree de orden por producto completo: -- 1) producto completo excede el limite de tupla B-tree en filas largas. -- 2) LEFT(producto, 512) encontro valores con codificacion invalida en esta base local. -- La optimizacion segura de esta iteracion se limita a predicados textuales indexables. -- Beneficia query_06/query_07: coincide exactamente con COALESCE(registro_sanitario, '') ILIKE '%marcapasos%'. CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_registro_coalesce_trgm ON invima_api_catalog USING GIN ((COALESCE(registro_sanitario, '')) gin_trgm_ops); -- Beneficia query_06/query_07: coincide exactamente con COALESCE(expediente, '') ILIKE '%marcapasos%'. CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_expediente_coalesce_trgm ON invima_api_catalog USING GIN ((COALESCE(expediente, '')) gin_trgm_ops); -- Beneficia query_06/query_07: coincide exactamente con COALESCE(producto, '') ILIKE '%marcapasos%'. CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_producto_coalesce_trgm ON invima_api_catalog USING GIN ((COALESCE(producto, '')) gin_trgm_ops); -- Beneficia query_06/query_07: coincide exactamente con COALESCE(categoria_canonica, '') ILIKE '%marcapasos%'. CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_categoria_canonica_coalesce_trgm ON invima_api_catalog USING GIN ((COALESCE(categoria_canonica, '')) gin_trgm_ops); -- Beneficia query_06/query_07: coincide exactamente con COALESCE(categoria_linea, '') ILIKE '%marcapasos%'. CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_bench_catalog_categoria_linea_coalesce_trgm ON invima_api_catalog USING GIN ((COALESCE(categoria_linea, '')) gin_trgm_ops); -- Mejora estimaciones de cardinalidad y ordenamiento de query_06/query_07. ALTER TABLE invima_api_catalog ALTER COLUMN fecha_vencimiento SET STATISTICS 1000; ALTER TABLE invima_api_catalog ALTER COLUMN producto SET STATISTICS 1000; ALTER TABLE invima_api_catalog ALTER COLUMN registro_sanitario SET STATISTICS 1000; ALTER TABLE invima_api_catalog ALTER COLUMN expediente SET STATISTICS 1000; ALTER TABLE invima_api_catalog ALTER COLUMN categoria_canonica SET STATISTICS 1000; ALTER TABLE invima_api_catalog ALTER COLUMN categoria_linea SET STATISTICS 1000; ALTER TABLE invima_api_catalog ALTER COLUMN search_text SET STATISTICS 1000; -- ANALYZE invima_api_catalog se deja como paso manual opcional. -- En la base local inspeccionada falla por datos textuales con codificacion invalida (0xc3). -- No se corrigen datos regulatorios desde esta migracion.