0Pricing
Coding Interview Prep · Lección

Seq Scan frente a Index Scan e Index-Only

Por qué el planificador elige cada uno y qué le indica sobre su consulta.

Seq Scan frente a Index Scan e Index-Only es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 2 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.

Tres formas de leer una tabla

Cuando el planificador necesita filas de una tabla, elige uno de tres métodos de acceso, y los entrevistadores esperan que mencione los tres:

  • Seq Scan, leer todas las filas de la tabla de principio a fin.
  • Index Scan, recorrer un índice para encontrar las filas coincidentes y, después, obtener cada una de la tabla.
  • Index-Only Scan, responder por completo desde el índice sin acceder a la tabla.

Comprender por qué el planificador elige cada uno es el núcleo de esta lección y una pregunta sénior habitual.

Qué hace un escaneo secuencial

Un Seq Scan lee las páginas de la tabla una tras otra y aplica cualquier filtro a cada fila. No se consulta ningún índice.

Esto puede parecer negativo, pero a menudo es la opción correcta. Las lecturas secuenciales son rápidas para el disco (no requieren saltos aleatorios), por lo que, cuando una consulta devuelve una gran parte de la tabla, escanearla completa es mejor que recorrer un índice millones de veces.

El ejemplo: escanear orders y conservar las filas donde amount > 100. Si la mayoría de los pedidos supera 100, un escaneo secuencial es correcto.

EXPLAIN SELECT * FROM orders WHERE amount > 100;

Seq Scan on orders  (cost=0.00..18334.00 rows=900000 width=64)
  Filter: (amount > 100)

Qué hace un escaneo mediante índice

Un Index Scan utiliza un árbol B para saltar directamente a las claves coincidentes y, después, leer las filas correspondientes del heap de la tabla.

Es especialmente eficaz cuando el filtro es selectivo y devuelve una pequeña parte de la tabla. Buscar 5 filas mediante un índice es mejor que leer 10 millones.

El plan indica el índice que ha utilizado. Cada coincidencia cuesta una búsqueda en el índice más una obtención desde el heap (una lectura aleatoria), por lo que los escaneos mediante índice pierden su ventaja cuando devuelven demasiadas filas.

EXPLAIN SELECT * FROM orders WHERE customer_id = 42;

Index Scan using idx_orders_customer on orders
  (cost=0.42..38.50 rows=12 width=64)
  Index Cond: (customer_id = 42)

La selectividad decide la elección

El concepto único que determina todo esto es la selectividad: la fracción de filas que conserva un predicado.

  • Una selectividad alta (coinciden pocas filas, como con un identificador único) favorece un Index Scan.
  • Una selectividad baja (coinciden muchas filas, como con status IS NOT NULL) favorece un Seq Scan.

Una regla práctica habitual: cuando una consulta devuelve más o menos del 5 al 10 % de una tabla, el planificador suele preferir un escaneo secuencial, porque las obtenciones aleatorias del heap que requiere un índice resultan más costosas que leerlo todo en orden.

El escaneo solo mediante índice

Un Index-Only Scan es el más rápido de los tres. Si todas las columnas que necesita la consulta ya están en el índice, el motor no accede al heap de la tabla.

La consulta de ejemplo selecciona únicamente customer_id y aplica el filtro sobre esa columna, y el índice está creado sobre customer_id. Todos los datos necesarios están en el índice, por lo que Postgres informa de un Index Only Scan.

Esto evita las lecturas aleatorias del heap que ralentizan un escaneo normal mediante índice, una gran ventaja en tablas anchas.

EXPLAIN SELECT customer_id FROM orders WHERE customer_id = 42;

Index Only Scan using idx_orders_customer on orders
  (cost=0.42..8.44 rows=12 width=4)
  Index Cond: (customer_id = 42)

La trampa del mapa de visibilidad

A los entrevistadores les encanta este matiz. Un escaneo solo mediante índice aún debe confirmar que cada fila es visible para su transacción (MVCC), y el índice por sí solo no almacena la visibilidad.

Postgres utiliza el mapa de visibilidad: si una página está marcada como all-visible, omite el heap; si no, debe obtener la fila del heap de todos modos. El plan muestra Heap Fetches: N.

Por eso una tabla recién actualizada puede mostrar muchas obtenciones del heap y ralentizar los escaneos solo mediante índice hasta que VACUUM actualiza el mapa de visibilidad.

Index Only Scan using idx_orders_customer on orders
  (actual time=0.01..0.03 rows=12 loops=1)
  Heap Fetches: 0

Escaneos de tipo bitmap: el punto intermedio

Hay un cuarto método que aparece con frecuencia: Bitmap Heap Scan. El planificador lo elige cuando un predicado coincide con más filas de las que conviene devolver mediante un escaneo normal con índice, pero con menos filas de las que contiene la tabla completa.

Primero construye un bitmap de las ubicaciones de las filas coincidentes a partir del índice (Bitmap Index Scan) y, después, obtiene las páginas del heap en orden físico en lugar de hacerlo en orden aleatorio. Las obtenciones ordenadas son mucho más económicas que las lecturas dispersas de un escaneo normal mediante índice.

Bitmap Heap Scan on orders  (cost=12.0..520.0 rows=8000)
  Recheck Cond: (status = 'pending')
  ->  Bitmap Index Scan on idx_orders_status
        (cost=0..12 rows=8000)
        Index Cond: (status = 'pending')

Por qué el planificador ignoró su índice

Una pregunta clásica de entrevista: He añadido un índice, pero el plan sigue haciendo un Seq Scan, ¿por qué? Motivos habituales:

  • El predicado no es selectivo; escanear es realmente más barato.
  • Una función envuelve la columna: WHERE lower(email) = ... no puede utilizar un índice normal sobre email.
  • Una incompatibilidad de tipos fuerza una conversión implícita que inutiliza el índice.
  • Estadísticas desactualizadas; ejecute ANALYZE.
  • La tabla es pequeña; escanear unas pocas páginas es mejor que asumir la sobrecarga de un índice.

Diagnóstico resuelto

Suponga que orders tiene un índice sobre created_at, pero esta consulta aún realiza un escaneo secuencial:

El culpable es DATE(created_at). Al envolver la columna en una función, no se puede utilizar el índice sobre el created_at sin modificar. La solución consiste en reescribir la consulta como un predicado de rango que deje la columna sin envolver, o crear un índice de expresión sobre DATE(created_at).

-- Slow: function on the indexed column
WHERE DATE(created_at) = '2026-01-01'

-- Fast: bare column, range uses the index
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-01-02'

Comparación de los métodos

Para la entrevista, tenga presente esta comparación:

  • Seq Scan, mejor al devolver una gran parte de las filas; E/S secuencial.
  • Index Scan, mejor para búsquedas selectivas; recorrido del índice más obtenciones aleatorias del heap.
  • Bitmap Heap Scan, para una cantidad intermedia de coincidencias; índice a bitmap y, después, lecturas ordenadas del heap.
  • Index-Only Scan, el más rápido cuando el índice cubre todas las columnas necesarias y las páginas están marcadas como all-visible.

El planificador elige según el coste estimado, determinado principalmente por la selectividad y las estadísticas.

Forzar una prueba (y por qué no hacerlo en producción)

Para demostrar un punto durante el desarrollo, puede influir temporalmente en el planificador: SET enable_seqscan = off; lo obliga a preferir los índices para que pueda comparar los planes.

Este es un recurso de diagnóstico, nunca una solución para producción. En las entrevistas, mencione que las soluciones reales son disponer de mejores estadísticas, utilizar un índice adecuado o reescribir el predicado, no desactivar globalmente las funciones del planificador.

SET enable_seqscan = off;
EXPLAIN ANALYZE SELECT * FROM orders WHERE amount > 100;
SET enable_seqscan = on;

Comprobación rápida

Una consulta selecciona únicamente email y aplica el filtro sobre email, y existe un índice B-tree sobre email. El plan muestra Index Only Scan. ¿Por qué es más rápido que un Index Scan normal?

Resumen

Conclusiones clave sobre los métodos de acceso:

  • Seq Scan es la mejor opción para consultas con baja selectividad; Index Scan lo es para las selectivas.
  • Index-Only Scan evita el heap cuando el índice cubre todas las columnas necesarias; preste atención a Heap Fetches y al mapa de visibilidad.
  • Bitmap Heap Scan cubre el punto intermedio al obtener las páginas del heap en orden físico.
  • El planificador decide según la selectividad y las estadísticas; las funciones sobre columnas, las incompatibilidades de tipos y las estadísticas desactualizadas son motivos por los que se ignora un índice.

Preguntas frecuentes

¿La lección «Seq Scan frente a Index Scan e Index-Only» es gratis?

Sí — el texto completo de «Seq Scan frente a Index Scan e Index-Only» 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 «Seq Scan frente a Index Scan e Index-Only»?

Por qué el planificador elige cada uno y qué le indica sobre su consulta. 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 2 de 4.

¿Cuánto tiempo toma la lección «Seq Scan frente a Index Scan e Index-Only»?

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