0Pricing
SQL Academy · Lección

Índices parciales y de expresiones

Indexe solo las filas que le interesen mediante cláusulas WHERE, e indexe expresiones calculadas (lower(email), date_trunc('day', ts)).

Índices parciales y de expresiones es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 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.

Índice parcial: indexar un subconjunto

Un índice parcial solo incluye las filas que coinciden con una cláusula WHERE al crear el índice. Es más pequeño, más rápido y excelente para la consulta más habitual:

CREATE INDEX users_active_email_idx
  ON users(email)
  WHERE deleted_at IS NULL;

Cuándo resultan útiles los índices parciales

Utilícelos cuando:

  • Siempre filtra con el mismo predicado (por ejemplo, el borrado lógico)
  • Un valor predomina en la columna (por ejemplo, el 95 % de las filas tiene status='closed')
  • Quiere un índice pequeño y activo en la caché

Ejemplo: sesiones activas

La mayoría de las sesiones han caducado; solo se consultan las activas:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE expires_at > NOW();
-- Caveat: planner can't use NOW() in the index predicate — use a fixed timestamp
-- and reindex periodically, OR use a boolean column.

Mejor: utilice un predicado estable

El predicado del índice debe ser immutable. Las expresiones que dependen del tiempo (NOW()) no son válidas. Utilice en su lugar una columna como is_active:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE is_active = true;

-- The query must use the same predicate to match the index:
SELECT * FROM sessions WHERE is_active = true AND user_id = 42;

Índice de expresión

Indexe una función de una columna:

CREATE INDEX users_email_lower_idx ON users(LOWER(email));

SELECT * FROM users WHERE LOWER(email) = LOWER('Alice@Example.com');
-- Uses the expression index.

Índices de expresión habituales

  • LOWER(email) para búsquedas que no distinguen entre mayúsculas y minúsculas
  • (price * tax_rate) para ordenar por un valor calculado
  • date_trunc('day', created_at) para informes diarios
  • (data ->> 'user_id')::BIGINT para extraer datos JSONB

La expresión debe ser IMMUTABLE

La expresión debe estar marcada como IMMUTABLE: su resultado depende únicamente de la entrada. RANDOM(), NOW() y CURRENT_USER no son válidas.

Combinación de índice parcial y de expresión

Ambos pueden combinarse:

CREATE INDEX articles_active_title_idx
  ON articles(LOWER(title))
  WHERE published_at IS NOT NULL;

Índices parciales únicos

El patrón clásico de «una única fila activa»:

CREATE UNIQUE INDEX users_one_active_email
  ON users(email)
  WHERE deleted_at IS NULL;

-- Same email can exist many times in deleted users, but only once active.

El predicado del índice debe coincidir con la consulta

El planificador solo utiliza el índice parcial cuando la cláusula WHERE de la consulta «implica» el predicado del índice:

-- Index:  WHERE is_active = true
-- Match:  WHERE is_active = true AND user_id = 42       ✓
-- Match:  WHERE is_active AND user_id = 42             ✓
-- No:     WHERE user_id = 42                           ✗
-- No:     WHERE is_active IS NOT FALSE                 ✗ (logically same but planner may not realise)

No abuse de ellos

Muchos índices parciales que cubren subconjuntos disjuntos pueden ralentizar las escrituras (cada INSERT debe actualizar todos los índices relevantes). Utilícelos con moderación para las consultas críticas.

Resumen

Los índices parciales y de expresión ofrecen más rendimiento por byte.

  • Parcial: indexe solo el subconjunto que consulta
  • De expresión: indexe valores calculados
  • Ambos requieren predicados IMMUTABLE
  • La consulta debe utilizar el mismo predicado para coincidir

Comprobación rápida

Quiere realizar búsquedas de correo electrónico sin distinguir entre mayúsculas y minúsculas. ¿Qué índice es más eficiente?

Preguntas frecuentes

¿La lección «Índices parciales y de expresiones» es gratis?

Sí — el texto completo de «Índices parciales y de expresiones» 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 parciales y de expresiones»?

Indexe solo las filas que le interesen mediante cláusulas WHERE, e indexe expresiones calculadas (lower(email), date_trunc('day', ts)). 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 3 de 4.

¿Cuánto tiempo toma la lección «Índices parciales y de expresiones»?

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. Índices B-tree, Hash, GiST y GIN
  2. Índices compuestos y orden de las columnas
  3. Índices parciales y de expresiones
  4. Mantenimiento de índices y fragmentación
← Volver a SQL Academy