0Pricing
Coding Interview Prep · Lección

Detectar y corregir consultas lentas

Una lista de comprobación para diagnosticar la pregunta de entrevista «esta consulta es lenta, soluciónela».

Detectar y corregir consultas lentas es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.

La pregunta «Esta consulta es lenta, soluciónela»

Esta es la pregunta culminante de la entrevista: el entrevistador le entrega una consulta lenta y un plan de EXPLAIN ANALYZE y le pide que la diagnostique. Está evaluando un método, no trucos memorizados.

Una buena respuesta sigue una lista de comprobación en voz alta: medir, leer el plan, encontrar el coste dominante, formular una hipótesis, proponer una solución y verificarla. Esta lección desarrolla esa lista paso a paso.

Mantenga un enfoque sistemático y explique su razonamiento; eso es lo que le hará obtener una valoración de nivel sénior.

Paso 1: medir con EXPLAIN ANALYZE

Nunca se base solo en el SQL. Obtenga el plan real con EXPLAIN (ANALYZE, BUFFERS).

ANALYZE proporciona los tiempos y el número de filas reales; BUFFERS muestra si está accediendo a la caché o leyendo del disco. Juntos indican si la consulta está limitada por la CPU, por la E/S o simplemente está haciendo demasiado trabajo.

Ejecútelo un par de veces; la primera ejecución puede incluir el coste de una caché fría y distorsionar el tiempo.

EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.created_at >= '2026-01-01';

Paso 2: encontrar el nodo dominante

No lea el plan de arriba abajo buscando al azar. Encuentre el nodo donde realmente se invierte más tiempo.

Calcule el tiempo propio de cada nodo: su actual time total menos el tiempo de sus hijos, multiplicado por loops. El nodo con la mayor proporción es su objetivo; todo lo demás es ruido.

En una entrevista, diga: el 80 por ciento del tiempo de ejecución está en este Seq Scan, así que me concentro ahí. Optimizar cualquier otra cosa sería un esfuerzo desperdiciado.

Paso 3: comparar lo estimado con lo real

En el nodo dominante, compare las filas estimadas con las filas reales. Una diferencia grande significa que el planificador está a ciegas y probablemente eligió un plan incorrecto (un algoritmo de join o un método de acceso equivocado).

El ejemplo muestra una subestimación de 1000 veces. Antes de rediseñar nada, actualice las estadísticas; este único comando suele corregir el plan sin coste.

ANALYZE recalcula las estadísticas de las columnas; VACUUM ANALYZE también limpia las tuplas obsoletas y actualiza el mapa de visibilidad.

-- estimate rows=100, actual rows=120000  -> stale stats
ANALYZE orders;
-- or, for bloated tables:
VACUUM ANALYZE orders;

Causa habitual: una función sobre una columna indexada

El error corregible más frecuente: una función o una conversión envuelve la columna en WHERE, por lo que no se puede usar el índice y el motor realiza un escaneo secuencial.

El ejemplo fuerza un escaneo completo porque aplica DATE() a cada fila. Reescríbalo como un predicado de rango sobre la columna sin envolver (forma sargable) y se activará el índice sobre created_at.

La misma idea se aplica a WHERE lower(email)=...: almacene los datos normalizados, consulte la columna sin envolver o cree un índice sobre la expresión.

-- Not sargable: index unusable
WHERE DATE(created_at) = '2026-01-01'

-- Sargable: range over the bare column
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-01-02'

Causa habitual: falta un índice

Si el nodo dominante es un Seq Scan con un filtro muy selectivo, o un Nested Loop con un número enorme de loops sobre una clave interna sin índice, la solución suele ser crear un índice.

Añada un índice sobre la columna filtrada o de join. El ejemplo crea uno sobre customer_id para que el join pueda cambiar de escaneos secuenciales a escaneos mediante índice, y el planificador pueda elegir un plan mucho más barato.

Verifíquelo volviendo a ejecutar EXPLAIN ANALYZE; no dé por hecho que el índice ayudó.

CREATE INDEX idx_orders_customer
  ON orders (customer_id);

Causa habitual: SELECT * y filas anchas

SELECT * extrae todas las columnas del disco y las transmite por la red, además de impedir los escaneos que solo usan el índice, porque rara vez el índice contiene todas las columnas.

Seleccione únicamente las columnas que necesite. Esto reduce el tamaño de las filas, disminuye la E/S y puede permitir un escaneo que solo use un índice de cobertura.

Si un entrevistador incluye SELECT * deliberadamente, quiere que lo detecte. Reducir la lista de columnas suele producir una mejora rápida y real en tablas anchas.

-- Before
SELECT * FROM orders WHERE customer_id = 42;

-- After: only needed columns (may enable index-only scan)
SELECT order_id, amount FROM orders WHERE customer_id = 42;

Causa habitual: desbordamiento al disco

Si un nodo Sort o Hash muestra uso de disco (Sort Method: external merge Disk: 25000kB o Batches: > 1), la operación superó el límite de work_mem y desbordó al disco.

Opciones: aumente work_mem para la sesión, reduzca el número de filas que llegan al ordenamiento o al hash (filtre antes), o añada un índice que proporcione el orden necesario para no tener que ordenar.

Este es un diagnóstico preciso y propio de un nivel sénior, justo el tipo de respuesta que los entrevistadores valoran.

Sort  (actual rows=2000000 loops=1)
  Sort Key: o.amount
  Sort Method: external merge  Disk: 25000kB

Causa habitual: obtener más filas de las necesarias

Preste atención a Rows Removed by Filter: 9500000. La consulta leyó diez millones de filas y descartó casi todas: es un desperdicio de trabajo clásico.

Soluciones: añada un índice para que el filtro se aplique durante el acceso (no después), haga que el predicado sea más selectivo o adelante el filtrado en la consulta para que asciendan menos filas por el árbol.

El principio es hacer el menor trabajo posible: filtre lo antes y lo más barato que pueda.

Seq Scan on events
  Filter: (event_type = 'purchase')
  Rows Removed by Filter: 9500000

La lista de comprobación para el diagnóstico

Repita esto en la entrevista y no perderá el rumbo:

  • Mida con EXPLAIN (ANALYZE, BUFFERS).
  • Localice el nodo que consume más tiempo.
  • Compare las filas estimadas con las reales y corrija primero las estadísticas obsoletas.
  • Compruebe la sargabilidad y elimine las funciones de las columnas filtradas.
  • Indexe los filtros selectivos y las claves de join.
  • Reduzca las columnas y evite SELECT *.
  • Vigile los desbordamientos al disco y la obtención excesiva de filas.
  • Verifique volviendo a ejecutar el plan.

Integración de conceptos

Explique en voz alta un ejemplo completo. El plan muestra un Seq Scan sobre una tabla orders de 50 millones de filas, con el filtro customer_id = 42, Rows Removed by Filter cercano a 50 millones y una estimación que coincide aproximadamente con el valor real.

Diagnóstico: filtro selectivo, sin índice; el coste dominante es el escaneo. Solución: CREATE INDEX ON orders(customer_id). Vuelva a ejecutar la consulta: el plan cambia a un Index Scan y el tiempo baja de varios segundos a menos de un milisegundo.

Ese ciclo de medir, diagnosticar, corregir y verificar es la plantilla de respuesta para cualquier pregunta sobre consultas lentas.

CREATE INDEX idx_orders_customer ON orders (customer_id);
EXPLAIN (ANALYZE, BUFFERS)
SELECT order_id, amount FROM orders WHERE customer_id = 42;

Comprobación rápida

Una consulta filtra con WHERE YEAR(order_date) = 2026 y el plan muestra un Seq Scan completo a pesar de que ya existe un índice B-Tree sobre order_date. ¿Cuál es la mejor primera solución?

Repaso

Ahora dispone de un método repetible para abordar preguntas sobre consultas lentas:

  • Siempre mida con EXPLAIN (ANALYZE, BUFFERS) y concéntrese en el nodo dominante.
  • Corrija primero las estadísticas obsoletas cuando las estimaciones y los valores reales difieran.
  • Haga que los predicados sean sargables, añada índices para filtros selectivos y claves de unión, y evite SELECT *.
  • Aborde los desbordamientos a disco y la recuperación excesiva de datos; después, verifique el nuevo plan.

Exponer la lista de comprobación, proponer un cambio concreto y volver a ejecutar el plan para demostrarlo: esa es la respuesta de un perfil sénior.

Preguntas frecuentes

¿La lección «Detectar y corregir consultas lentas» es gratis?

Sí — el texto completo de «Detectar y corregir consultas lentas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Detectar y corregir consultas lentas»?

Una lista de comprobación para diagnosticar la pregunta de entrevista «esta consulta es lenta, soluciónela». Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Coding Interview Prep?

No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Detectar y corregir consultas lentas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?

Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Leer un plan EXPLAIN
  2. Seq Scan frente a Index Scan e Index-Only
  3. Algoritmos de JOIN: Nested Loop, Hash y Merge
  4. Detectar y corregir consultas lentas
← Volver a Coding Interview Prep