Vistas indexadas en SQL Server

Clase 9 de 26Curso de Gestión de Bases de Datos con SQL Server

Resumen

Cuando cientos de usuarios ejecutan la misma vista al mismo tiempo, el motor de base de datos repite una y otra vez los mismos joins y agregaciones sobre las tablas originales. Esto genera un cuello de botella que afecta tanto la lectura como la escritura de datos. Las vistas indexadas en SQL Server resuelven ese problema almacenando el resultado precalculado, pero su uso exige cumplir requisitos estrictos y evaluar si realmente conviene aplicarlas.

¿Qué problema resuelven las vistas indexadas frente a las vistas normales?

Una vista normal recalcula todo cada vez que se consulta [0:04]. Si la vista "Ventas por país" recibe quinientas consultas por hora, eso significa quinientas ejecuciones del GROUP BY y cuatro joins contra las tablas base [0:40]. Mientras tanto, otros usuarios necesitan escribir datos en esas mismas tablas.

Aquí aparece el concepto de trade off: las consultas de lectura compiten con las operaciones de escritura [1:10]. Los datos nuevos que se insertan muchas veces no alcanzan a reflejarse en las vistas que se están ejecutando simultáneamente. Cuando este conflicto se vuelve frecuente, lo mejor es materializar la vista, es decir, guardar en memoria un resultado precalculado que evite ejecutar la consulta completa sobre tablas que ya están ocupadas con escritura [1:28].

¿Cómo se crea una vista indexada paso a paso?

Crear una vista indexada en SQL Server requiere dos pasos estrictos:

¿Qué hace el schema binding en la vista?

El primer paso es crear la vista con la cláusula WITH SCHEMABINDING [1:55]. Esta palabra clave le indica a SQL Server que la vista depende de tablas específicas —por ejemplo, pedidos y clientes— y que debe impedir cualquier modificación estructural sobre ellas mientras la vista exista [2:18].

  • Si intentas ejecutar ALTER TABLE pedidos DROP COLUMN total, SQL Server lo bloqueará [4:08].
  • El mensaje de error indica que un objeto depende de esa columna y la operación falla [4:20].
  • Para desbloquear las tablas, primero debes eliminar la vista [3:32].

Este comportamiento es intencional: protege la integridad de la vista materializada.

¿Cómo se materializa la vista con un índice clustered único?

El segundo paso es crear un índice clustered único sobre la vista [2:50]. Este índice es el que realmente materializa los datos: la información viaja desde las tablas base hacia un espacio de memoria dedicado donde queda disponible para todas las consultas [3:45]. Sin este índice, la vista sigue siendo solo una definición lógica.

sql CREATE VIEW dbo.ResumenVentasPais WITH SCHEMABINDING AS SELECT pais, COUNT_BIG(*) AS cantidad, SUM(total) AS total_ventas FROM dbo.Pedidos p JOIN dbo.Clientes c ON p.cliente_id = c.id GROUP BY pais; GO

CREATE UNIQUE CLUSTERED INDEX IX_ResumenVentasPais ON dbo.ResumenVentasPais(pais);

Para el usuario final no cambia nada: simplemente ejecuta un SELECT sobre la vista y obtiene resultados más rápidos [3:15].

¿Cuándo vale la pena indexar una vista y cuándo no?

Esta es una decisión de arquitectura real [4:42]. La regla de oro es clara: mide primero, indexa después, nunca al revés [5:50].

Sí vale la pena cuando:

  • La consulta se ejecuta decenas o cientos de veces por hora.
  • Las tablas base se modifican con poca frecuencia.
  • La consulta incluye agregaciones costosas sobre tablas grandes.
  • El tiempo de respuesta de los reportes es crítico para el negocio [4:50].

No vale la pena cuando:

  • Las tablas base reciben muchos inserts, updates o deletes (alta carga de escritura).
  • Los datos cambian constantemente, porque el costo de mantener la vista actualizada supera el beneficio.
  • La consulta se ejecuta pocas veces al día [5:20].

Para un caso como Tienda Latam, la vista "Resumen ventas país" es un buen candidato si los reportes se consultan con frecuencia y los pedidos completados rara vez se modifican [5:38].

Ahora es tu turno: de las vistas ventas por país, clientes sin pedido, productos top de ventas e inventario crítico (stock inferior a diez unidades), ¿cuáles indexarías y cuáles no? Comparte tu justificación en los comentarios.