Escaneos solo de índice y mapa de visibilidad
Habilite los escaneos solo de índice cubriendo las consultas y manteniendo actualizado el mapa de visibilidad.
Escaneos solo de índice y mapa de visibilidad es una lección gratuita de SQL Academy 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 SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué es un Index-Only Scan?
Normalmente, una búsqueda en un índice devuelve identificadores de fila (TID) y es necesario acceder a la tabla para leer la fila real. Index-Only Scan responde a la consulta usando únicamente el índice, sin acceder al heap. Es mucho más rápido.
Condiciones
Index-Only Scan requiere lo siguiente:
- Todas las columnas seleccionadas deben estar en el índice
- La página de la fila debe estar marcada como "all visible" en el mapa de visibilidad
Mapa de visibilidad
Un mapa de bits por cada página de la tabla: un bit activado significa que "todas las filas de esta página son visibles para todas las transacciones". VACUUM lo mantiene. Sin él, PostgreSQL debe acceder al heap para comprobar la visibilidad.
Hacer que una consulta use Index-Only
Cubra todas las columnas necesarias:
-- Query:
SELECT id, email FROM users WHERE id = 42;
-- Without an index on (id, email), only an Index Scan that visits the heap is possible.
-- With this:
CREATE INDEX users_id_email_idx ON users (id, email);
-- Or better:
CREATE INDEX users_id_email_idx ON users (id) INCLUDE (email);
-- The query can be index-only.INCLUDE
Índice de cobertura con columnas que no son claves (desde PG 11). La columna se almacena en las hojas, pero no se utiliza para ordenar, por lo que no afecta al coste de inserción:
CREATE INDEX users_id_idx ON users(id) INCLUDE (email, full_name);
SELECT id, email, full_name FROM users WHERE id = 42;
-- Index-only scan if visibility map allows.Por qué aún podría acceder al heap
Después de muchas escrituras, el mapa de visibilidad puede estar obsoleto. Ejecute VACUUM (sin FULL) para actualizarlo.
VACUUM (VERBOSE) users;
-- "scanned X pages, X of which are visible"
-- More visible pages = more Index-Only Scans possible.Verificar los Index-Only Scan
EXPLAIN lo muestra:
EXPLAIN ANALYZE
SELECT id, email FROM users WHERE id = 42;
-- Index Only Scan using users_id_email_idx on users
-- Index Cond: (id = 42)
-- Heap Fetches: 0 ← key numberQué indican los Heap Fetches
"Heap Fetches: 0": perfecto, todos los datos proceden del índice. "Heap Fetches: N": N filas necesitaron acceder al heap (el bit del mapa de visibilidad no estaba activado). Después de ejecutarse autovacuum, Heap Fetches suele disminuir.
Cuándo usar INCLUDE frente a un índice compuesto
- Use INCLUDE para las columnas que solo selecciona con SELECT (no para filtrar ni ordenar)
- Use un índice compuesto (clave) cuando también filtre u ordene por la columna
INCLUDE mantiene el índice más estrecho y acelera las escrituras.
El bloat del índice perjudica a Index-Only
Los índices con bloat tienen más páginas, por lo que incluso los Index-Only Scan leen más. Mantenga los índices sometidos a vacuum y vuelva a indexarlos cuando el bloat sea elevado.
No cubra todo
Añadir demasiadas columnas a un índice ralentiza las escrituras y hace que el índice sea enorme. Cubra solo las rutas de lectura más utilizadas.
Vistas materializadas como cobertura
Si desea una velocidad de lectura extrema para un informe específico, una vista materializada más un índice es, en esencia, un "índice de cobertura" con columnas calculadas arbitrarias.
Resumen
Index-Only Scan = la ruta de lectura más rápida.
- Todas las columnas seleccionadas deben estar en el índice
- INCLUDE añade columnas que no son claves de forma económica
- El mapa de visibilidad debe indicar "all visible": VACUUM lo mantiene actualizado
- En EXPLAIN, Heap Fetches: 0 es el objetivo
Comprobación rápida
En EXPLAIN observa Heap Fetches: 100.000 a pesar de que hay un nodo Index Only Scan. ¿Cuál es la solución habitual?
Preguntas frecuentes
¿La lección «Escaneos solo de índice y mapa de visibilidad» es gratis?
Sí — el texto completo de «Escaneos solo de índice y mapa de visibilidad» 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 SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Escaneos solo de índice y mapa de visibilidad»?
Habilite los escaneos solo de índice cubriendo las consultas y manteniendo actualizado el mapa de visibilidad. Practicas SQL Academy 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 SQL Academy?
No se requiere experiencia previa. SQL Academy 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 «Escaneos solo de índice y mapa de visibilidad»?
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 SQL Academy?
Sí. Cada lección de SQL Academy 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
- MVCC y causas de la fragmentación
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE y pg_statistic
- Escaneos solo de índice y mapa de visibilidad