Saltar al contenido

Vistas e índices

Tres objetos que no guardan datos propios pero cambian cómo se consultan: la vista, que da una cara distinta a una consulta; el índice, que la acelera; y el plan de ejecución, que enseña por dónde va a ir el gestor.

Vistas

Una vista es una consulta guardada con nombre que se usa después como si fuera una tabla. No almacena datos: lo que guarda es la definición del SELECT, de modo que cada vez que alguien la consulta el gestor ejecuta esa consulta contra las tablas reales y devuelve el resultado del momento.

sql
CREATE VIEW rendimiento_alumno AS
SELECT    a.id_alumno,
          a.nombre,
          COUNT(i.id_intento) AS intentos,
          AVG(i.aciertos)     AS media
FROM      alumno a
LEFT JOIN intento i ON i.id_alumno = a.id_alumno
GROUP BY  a.id_alumno, a.nombre;

-- Y a partir de ahí se consulta como una tabla más
SELECT nombre, media
FROM   rendimiento_alumno
WHERE  intentos > 0;
  • Simplifican: una combinación de cuatro tablas con su agrupación se escribe una vez y se consulta luego en una línea.
  • Aíslan: si cambia la estructura de las tablas de debajo, se ajusta la vista y las consultas que la usaban siguen funcionando igual.
  • Dan seguridad por filas y por columnas: se concede permiso sobre la vista y no sobre las tablas, de manera que el usuario solo alcanza los datos que la vista deja ver.

Para el examen

  • Qué es: una consulta guardada con nombre, sin datos propios

  • Para qué sirve: simplificar, aislar de cambios de esquema y dar seguridad por filas y columnas

  • Cómo da esa seguridad: concediendo permiso sobre la vista y no sobre las tablas

Escribir a través de una vista y WITH CHECK OPTION

Algunas vistas admiten INSERT, UPDATE y DELETE, que el gestor traslada a la tabla de debajo. Solo puede hacerlo si sabe a qué fila real corresponde cada fila de la vista, así que las que llevan agrupaciones, funciones de agregado, DISTINCT o combinaciones de varias tablas no suelen ser actualizables.

sql
CREATE VIEW alumno_express AS
SELECT id_alumno, nombre, modalidad
FROM   alumno
WHERE  modalidad = 'express'
WITH CHECK OPTION;

-- Rechazado: la fila resultante ya no se vería por la vista
UPDATE alumno_express SET modalidad = 'largo' WHERE id_alumno = 101;

WITH CHECK OPTION es la cláusula que cierra el agujero. Sin ella se puede insertar o modificar a través de la vista una fila que después no cumple su condición: entra en la tabla y desaparece de la vista, con lo que el usuario ve fracasar algo que en realidad ha funcionado. Con ella, el gestor rechaza toda inserción o modificación cuyo resultado no seguiría siendo visible por la vista.

La vista no guarda datos, guarda una consulta. La excepción es la vista materializada, que sí almacena el resultado y hay que refrescar para que no se quede viejo.

Para el examen

  • Cuándo una vista no es actualizable: si lleva agrupaciones, DISTINCT o varias tablas

  • WITH CHECK OPTION: rechaza escrituras cuyo resultado dejaría de verse por la vista

  • Vista materializada: sí guarda el resultado en disco

Índices

Un índice es una estructura auxiliar que el gestor mantiene aparte para localizar filas sin recorrer la tabla entera. Funciona como el índice de un libro: ordena las claves y para cada una guarda dónde está la fila, de modo que buscar deja de costar proporcionalmente al tamaño de la tabla.

sql
CREATE INDEX ix_intento_alumno_fecha
  ON intento (id_alumno, realizado);

En un índice de varias columnas el orden importa. Ese ejemplo sirve para buscar por alumno, y también por alumno y fecha a la vez, pero no sirve para buscar solo por fecha: es el mismo motivo por el que una guía telefónica ordenada por apellido y luego por nombre no ayuda a encontrar a todos los que se llaman Ana.

Los índices no son gratis. Cada uno ocupa espacio y, sobre todo, hay que actualizarlo en cada INSERT, UPDATE y DELETE que toque sus columnas. Por eso aceleran las consultas y frenan las escrituras, y por eso indexar por sistema todas las columnas de una tabla empeora el conjunto en lugar de mejorarlo.

Para el examen

  • Qué gana y qué pierde: acelera lecturas y penaliza escrituras

  • Índice compuesto: el orden de las columnas manda

  • Ejemplo: (id_alumno, realizado) sirve para buscar por alumno, pero no solo por fecha

Cómo está hecho un índice por dentro

La implementación habitual es un árbol equilibrado de la familia B, y en concreto el árbol B+. La diferencia con el árbol B a secas es que en el B+ los datos están solo en las hojas y las hojas van encadenadas entre sí, lo que permite dos cosas a la vez: bajar desde la raíz hasta una clave concreta en muy pocos saltos y, una vez abajo, recorrer un rango de valores siguiendo la cadena sin volver a subir.

Como el árbol se mantiene equilibrado, todas las hojas quedan a la misma profundidad y el coste de una búsqueda es logarítmico y estable. Traducido a lo que importa: en una tabla de millones de filas se llega a la que se busca leyendo un puñado de páginas, no la tabla entera.

No es el único tipo de índice. Los hay de dispersión, que resuelven la igualdad muy rápido pero no sirven para rangos ni para ordenar; los de mapa de bits, pensados para columnas con pocos valores distintos y típicos de entornos de análisis; y los de texto completo, para buscar palabras dentro de campos largos.

Para el examen

  • Implementación habitual: árbol B+

  • Sus propiedades: datos en las hojas, hojas encadenadas para rangos y coste logarítmico

  • Otros tipos: hash (solo igualdad), mapa de bits y texto completo

EXPLAIN PLAN: ver por dónde va a ir el gestor

Como SQL es declarativo, quien escribe la consulta no decide el camino. Lo decide el optimizador, y EXPLAIN PLAN es la sentencia que permite verlo antes de ejecutarla: muestra la secuencia de operaciones que el gestor piensa realizar para resolverla. Se puede pedir sobre SELECT, INSERT, UPDATE y DELETE.

sql
EXPLAIN PLAN FOR
SELECT   a.nombre, COUNT(*)
FROM     intento i
JOIN     alumno a ON a.id_alumno = i.id_alumno
WHERE    i.fallos > 5
GROUP BY a.nombre;

Es la herramienta con la que se diagnostica una consulta lenta. Lo que se busca en el plan es si el gestor va a recorrer la tabla entera o va a apoyarse en un índice, en qué orden va a combinar las tablas y en qué punto va a ordenar o agrupar. Si una consulta que debería usar un índice no lo usa, el plan lo enseña y ahí empieza el trabajo de ajuste.

El plan no es fijo: depende de los datos y de las estadísticas que el gestor tenga de ellos, así que la misma consulta puede resolverse de una forma hoy y de otra dentro de un mes.

Para el examen

  • Qué muestra: el plan del optimizador, sin ejecutar la consulta

  • Qué se busca en él: si usará un índice o recorrerá la tabla entera

  • De qué depende: de los datos y las estadísticas: no es fijo