<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Performance on Ivan Luminaria</title><link>https://ivanluminaria.com/es/tags/performance/</link><description>Recent content in Performance on Ivan Luminaria</description><generator>Hugo</generator><language>es</language><lastBuildDate>Tue, 24 Mar 2026 08:03:00 +0100</lastBuildDate><atom:link href="https://ivanluminaria.com/es/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>VACUUM y autovacuum: por qué PostgreSQL necesita que alguien limpie</title><link>https://ivanluminaria.com/es/posts/postgresql/vacuum-autovacuum-postgresql/</link><pubDate>Tue, 24 Mar 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/es/posts/postgresql/vacuum-autovacuum-postgresql/</guid><description>&lt;p&gt;Hace un par de años me pidieron revisar un PostgreSQL en producción que
&amp;ldquo;se ralentiza cada semana&amp;rdquo;. Siempre el mismo patrón: el lunes va bien,
el viernes es un desastre. El fin de semana alguien reinicia el
servicio y se empieza de nuevo.&lt;/p&gt;
&lt;p&gt;Base de datos de unos 200 GB. Las tablas principales ocupaban casi el
triple del espacio efectivo de los datos. Queries cayendo en sequential
scan donde no deberían. Tiempos de respuesta que subían día tras día.&lt;/p&gt;</description></item><item><title>Oracle en Linux: los parámetros del kernel que nadie configura</title><link>https://ivanluminaria.com/es/posts/oracle/oracle-linux-kernel/</link><pubDate>Tue, 24 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/es/posts/oracle/oracle-linux-kernel/</guid><description>&lt;p&gt;El cliente era una empresa de logística con Oracle 19c Enterprise Edition sobre Oracle Linux 8. Sesenta usuarios concurrentes, un ERP a medida, unos 400 GB de datos. El servidor era un Dell PowerEdge con 128 GB de RAM y 32 cores.&lt;/p&gt;
&lt;p&gt;Las quejas eran vagas pero persistentes: &amp;ldquo;El sistema va lento.&amp;rdquo; &amp;ldquo;Las queries de la mañana tardan el doble que hace dos meses.&amp;rdquo; &amp;ldquo;De vez en cuando se congela todo unos segundos.&amp;rdquo;&lt;/p&gt;</description></item><item><title>AWR, ASH y los 10 minutos que salvaron un go-live</title><link>https://ivanluminaria.com/es/posts/oracle/oracle-awr-ash/</link><pubDate>Tue, 10 Feb 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/es/posts/oracle/oracle-awr-ash/</guid><description>&lt;p&gt;Viernes, 18:40. Ya tenía la chaqueta puesta, listo para salir. El teléfono vibra. Es el project manager.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Ivan, tenemos un problema. El sistema va lentísimo. Mañana por la mañana es el go-live.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;No es la primera vez que recibo una llamada así. Pero el tono era diferente. No era la queja genérica sobre la lentitud. Era pánico.&lt;/p&gt;
&lt;p&gt;Me reconecto por VPN, abro una sesión en la base de datos Oracle 19c del cliente. Lo primero que hago es una comprobación rápida:&lt;/p&gt;</description></item><item><title>When a LIKE '%value%' Slows Everything Down: A Real PostgreSQL Optimization Case</title><link>https://ivanluminaria.com/es/posts/postgresql/like-optimization-postgresql/</link><pubDate>Tue, 06 Jan 2026 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/es/posts/postgresql/like-optimization-postgresql/</guid><description>&lt;p&gt;Hace algunas semanas, un cliente me contactó con un problema muy común:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;La búsqueda en la consola administrativa es lenta. A veces tarda
varios segundos. Ya hemos reducido las JOIN, pero el problema no ha
desaparecido.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Entorno: PostgreSQL en cloud managed.&lt;br&gt;
Tabla principal: &lt;code&gt;payment_report&lt;/code&gt; (~6 millones de filas, 3 GB).&lt;br&gt;
Columna buscada: &lt;code&gt;reference_code&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Query problemática:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reporting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_report&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reporting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_cart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cart_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1001&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reference_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LIKE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%ABC123%&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="-primera-observación-las-join-no-eran-el-problema" class="relative group"&gt;🧠 Primera observación: las JOIN no eran el problema &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#-primera-observaci%c3%b3n-las-join-no-eran-el-problema" aria-label="Ancla"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Comparé:&lt;/p&gt;</description></item><item><title>Oracle Partitioning: cuando 2 mil millones de filas ya no caben en una query</title><link>https://ivanluminaria.com/es/posts/oracle/oracle-partitioning/</link><pubDate>Tue, 23 Dec 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/es/posts/oracle/oracle-partitioning/</guid><description>&lt;p&gt;Dos mil millones de filas. No es un número que se alcance en un día. Se necesitan años de transacciones, movimientos, registros diarios que se acumulan. Y durante todo ese tiempo la base de datos funciona, las consultas responden, los reportes salen. Luego un día alguien abre un ticket: &amp;ldquo;el reporte mensual tarda cuatro horas.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Cuatro horas. Para un reporte que seis meses antes tardaba veinte minutos.&lt;/p&gt;
&lt;p&gt;No es un bug. No es un problema de red o de almacenamiento lento. Es la física de los datos: cuando una tabla crece más allá de cierto umbral, los enfoques que funcionaban dejan de funcionar. Y si no diseñaste la estructura para manejar ese crecimiento, la base de datos hace lo único que puede: leerlo todo.&lt;/p&gt;</description></item><item><title>EXPLAIN ANALYZE no basta: como leer realmente un plan de ejecucion PostgreSQL</title><link>https://ivanluminaria.com/es/posts/postgresql/explain-analyze-postgresql/</link><pubDate>Tue, 28 Oct 2025 08:03:00 +0100</pubDate><guid>https://ivanluminaria.com/es/posts/postgresql/explain-analyze-postgresql/</guid><description>&lt;p&gt;El otro dia un colega me manda una captura de pantalla por Teams. Una query corriendo sobre una tabla de 2 millones de filas, 45 segundos de ejecucion. Me escribe:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Hice EXPLAIN ANALYZE, pero no entiendo que esta mal. El plan parece correcto.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Spoiler: el plan no era correcto en absoluto. El optimizer habia elegido un &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="Nested Loop Join — la estrategia de join que escanea la tabla interna por cada fila de la tabla externa, ideal para datasets pequenos con indice." data-glossary-url="https://ivanluminaria.com/es/glossary/nested-loop/" data-glossary-more="Leer más →"&gt;nested loop&lt;/span&gt;
 join donde hacia falta un &lt;span class="glossary-tip" tabindex="0" data-glossary-desc="Hash Join — estrategia de join optimizada para grandes volumenes de datos, basada en una hash table construida en memoria." data-glossary-url="https://ivanluminaria.com/es/glossary/hash-join/" data-glossary-more="Leer más →"&gt;hash join&lt;/span&gt;
, y la razon era trivial — estadisticas desactualizadas. Pero para llegar a eso tuve que leer el plan linea por linea, y ahi me di cuenta de que la mayoria de los DBA que conozco usan EXPLAIN ANALYZE como un oraculo binario: si el tiempo es alto, la query es lenta. Fin del analisis.&lt;/p&gt;</description></item></channel></rss>