0Pricing
SQL Academy · Lección

Índices concurrentes (CREATE INDEX CONCURRENTLY)

Cree índices sin bloquear las escrituras mediante CREATE INDEX CONCURRENTLY y recupérese de creaciones interrumpidas.

Índices concurrentes (CREATE INDEX CONCURRENTLY) es una lección gratuita de SQL Academy 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 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.

El problema de CREATE INDEX

Un CREATE INDEX normal adquiere un bloqueo SHARE: bloquea las escrituras, pero no las lecturas, durante toda la creación. En una tabla con mil millones de filas, esto supone varios minutos de interrupción de las escrituras.

CONCURRENTLY: la solución

CREATE INDEX CONCURRENTLY crea el índice sin bloquear las escrituras:

CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id);

Cómo funciona

Dos recorridos de la tabla:

  1. Primera pasada: crea el índice a partir de las filas actuales
  2. Segunda pasada: incorpora las filas modificadas durante la primera pasada

Además, espera brevemente a cualquier transacción simultánea que se iniciara antes de la creación.

No se puede ejecutar dentro de una transacción

CONCURRENTLY confirma la transacción dos veces, por lo que no puede ejecutarse dentro de un bloque explícito BEGIN/COMMIT:

BEGIN;
CREATE INDEX CONCURRENTLY ...;  -- ERROR
COMMIT;

Lento, pero en línea

CONCURRENTLY tarda más que un CREATE INDEX normal (dos recorridos y esperas de bloqueos). La ventaja: cero tiempo de inactividad.

Recuperación tras un fallo

Si CONCURRENTLY falla (por una interrupción o un error del sistema), el índice queda en estado INVALID:

SELECT relname FROM pg_class
WHERE relkind = 'i' AND NOT pg_index.indisvalid;

-- Fix: drop and re-create:
DROP INDEX CONCURRENTLY my_idx;
CREATE INDEX CONCURRENTLY my_idx ON ...;

REINDEX CONCURRENTLY

Lo reconstruye sin bloquear, desde PG 12:

REINDEX INDEX CONCURRENTLY orders_user_id_idx;
REINDEX TABLE CONCURRENTLY orders;

DROP INDEX CONCURRENTLY

Tampoco bloquea:

DROP INDEX CONCURRENTLY old_idx;

Índices UNIQUE

Los índices UNIQUE también se pueden crear con CONCURRENTLY. Resulta útil para añadir restricciones UNIQUE en línea:

CREATE UNIQUE INDEX CONCURRENTLY users_email_uidx ON users(email);
ALTER TABLE users ADD CONSTRAINT users_email_unique UNIQUE USING INDEX users_email_uidx;

Índices de claves foráneas

Patrón estándar para añadir una FK a una tabla grande:

-- 1. Build the index online:
CREATE INDEX CONCURRENTLY orders_user_id_idx ON orders(user_id);

-- 2. Add the FK with NOT VALID (instant):
ALTER TABLE orders ADD CONSTRAINT orders_user_fk
  FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;

-- 3. Validate in the background:
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;

Coste de crear índices simultáneamente

Dos recorridos completos de la tabla, además del mantenimiento de estructuras auxiliares. Consume CPU y E/S. Si es posible, ejecútelo durante las horas de menor tráfico.

Supervisar el progreso

PG 12 y versiones posteriores muestran el progreso en pg_stat_progress_create_index:

SELECT phase,
       blocks_done, blocks_total,
       tuples_done, tuples_total
FROM pg_stat_progress_create_index;

Resumen

CONCURRENTLY es la forma adecuada para producción de gestionar los índices.

  • CREATE/DROP/REINDEX CONCURRENTLY no bloquean las escrituras
  • No pueden ejecutarse dentro de una transacción
  • Los fallos dejan índices INVALID: debe limpiarlos
  • Supervise el progreso con pg_stat_progress_create_index

Comprobación rápida

¿Por qué CREATE INDEX CONCURRENTLY no puede ejecutarse dentro de un bloque explícito BEGIN/COMMIT?

Preguntas frecuentes

¿La lección «Índices concurrentes (CREATE INDEX CONCURRENTLY)» es gratis?

Sí — el texto completo de «Índices concurrentes (CREATE INDEX CONCURRENTLY)» 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 «Índices concurrentes (CREATE INDEX CONCURRENTLY)»?

Cree índices sin bloquear las escrituras mediante CREATE INDEX CONCURRENTLY y recupérese de creaciones interrumpidas. 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 2 de 4.

¿Cuánto tiempo toma la lección «Índices concurrentes (CREATE INDEX CONCURRENTLY)»?

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

  1. Migraciones en línea: por qué ALTER TABLE bloquea
  2. Índices concurrentes (CREATE INDEX CONCURRENTLY)
  3. Renombrado de columnas sin tiempo de inactividad
  4. Herramientas: Flyway, Liquibase, Sqitch
← Volver a SQL Academy