SQL T8 V1.0
SQL T8 V1.0
SQL T8 V1.0
ÍNDICES Y TRANSACCIONES
8.1 ÍNDICES
8.11 TRANSACCIONES
8.20 RESUMEN
8.1 ÍNDICES
A diferencia de las tablas y las vistas, que son objetos de primer nivel en una base de
datos, los índices son estructuras que van indivisiblemente unidas precisamente a una tabla
o a una vista. Puede haber más de un índice por tabla.
Los índices son estructuras creadas partir de datos que existen en una o más
columnas de una tabla o vista, es decir, contienen los mismos datos que ya hay en la base
de datos, lo que les hace útiles, sin embargo, no son los datos contenidos sino el orden en
que éstos se almacenan. Un orden que acelera las operaciones de búsqueda y selección.
Para comprenderlo mejor tan solo hay que pensar en cómo actúa una consulta sobre una
cierta tabla.
Ejemplo: Supongamos que un cliente de una librería solicita un cierto libro facilitando
su ISBN, por lo que se efectúa una consulta en la tabla LIBROS similar a la siguiente:
Si tomamos el ISBN de cada uno de los libros existentes en la tabla LIBROS y los
almacenamos en una lista debidamente ordenada, creando un índice con los ISBN
similar al índice de un libro, el proceso de búsqueda se simplificaría
considerablemente. Al ejecutar la misma consulta anterior, el gestor de base de
datos detectaría el índice y realizaría la búsqueda en él. Al estar ordenado, sin
embargo, no tiene por qué recorrerlo secuencialmente de principio a fin, sino que
bastan unas cuantas lecturas basadas en un algoritmo más eficiente (el de los
Árboles B) para encontrarlo rápidamente.
Lógicamente, esta lista ordenada con los ISBN debe mantener, además, un enlace o
apuntador a la fila correspondiente de la tabla LIBROS, de tal forma que sea
posible acceder al resto de los datos son tener que duplicarlos todos.
Tras crear el índice basado en la columna ISBN de la tabla LIBROS, es lógico pensar
que en algún momento se añadirán nuevos libros a dicha tabla, lo cual, indirectamente,
significa que habrá que insertar nuevas entradas en el índice. Insertar y no añadir, puesto
que aunque la nueva fila se añada al final de la tabla, la entrada correspondiente en el
índice, por el contario, deberá insertarse en la posición adecuada para seguir teniendo una
lista de ISBN ordenada.
Pueden existir tablas con dos, tres o incluso más índices. Lo que hay que analizar,
para buscar un equilibrio entre el rendimiento de las consultas y el de las demás
operaciones con las tablas, es cuándo se necesita el índice y cuándo éste no mejora de
forma apreciable el trabajo con la base de datos.
en tablas que cuentan con pocas filas los índices NO mejoran mucho el tiempo en
que se ejecuta una consulta.
En tablas que tienen muchas filas, por el contrario, el índice adquiere mucha más
importancia, sobre todo si las consultas a la tabla son frecuentes.
Índice único/no único. Un índice único es aquel índice que no permite que 2
filas tengan el mismo valor en la columna o columnas que forman el índice,
incluyendo el valor nulo (NULL). Un índice no único sí admite valores del índice
iguales en distintas filas.
Entonces ¿por qué no usar siempre índices agrupados o clustered? En primer lugar,
lamentablemente solo puede haber un índice agrupado por tabla. La razón es muy sencilla
y lógica: Los datos de la tabla están físicamente ordenados según el índice agrupado y,
obviamente, una tabla no puede estar físicamente ordenada de dos maneras diferentes a la
vez.
Por lo tanto, en tablas grandes y muy consultadas, tenemos que ser cuidadosos y
analizar qué columnas vamos a seleccionar para formar el índice agrupado (clustered).
Tenemos un solo índice de este tipo por tabla, ¡no hay que desperdiciarlo!
¿En qué situaciones y para qué columnas se debe utilizar un índice agrupado
(clustered) o uno no agrupado (non-clustered)? Los siguientes puntos pueden ser una guía
general para la decisión:
Al tratar las vistas, decíamos que éstas no almacenan en la base de datos las filas y
columnas que la forman, sino la sentencia SQL necesaria para poder generar
dinámicamente la vista cuando sea necesario.
Es posible alterando la propia vista, haciendo que ésta almacene en la base de datos
no solamente la sentencia SQL sino también los propios datos. De esta manera, la vista
pasaría a ser como cualquier otra tabla de la base de datos, siendo posible la creación de un
índice a partir de sus columnas.
Además, hay que considerar que, para que la vista se mantenga siempre actualizada,
cada vez que insertemos, eliminemos o modifiquemos filas de las tablas que participan en
el vista, SQL Server se verá forzado a efectuar la misma operación en la vista, los índices
Pilar García López SQL Pág. 4
Tema 8
Los beneficios de un índice asociado a una vista, por tanto, hay que examinarlos con
mucho detalle para decidir si realmente merece la pena el coste de espacio y rendimiento a
la hora de manipular las tablas de datos.
Sin embargo, en este otro ejemplo se definen los índices al revés de como se haría por
defecto. Sería recomendable esta definición si sabemos que la mayoría de las búsquedas se
van a hacer a través del valor de NumDocumento, por eso se le asigna a esta columna el
índice agrupado, que es el más eficiente:
En el siguiente ejemplo se define una clave primaria para la tabla AUTORES y, por
tanto, un índice asociado a ella. Se define expresamente que sea el índice agrupado:
• Un índice único es aquel índice que no permite que 2 filas tengan el mismo
valor de índice.
• Para crear un índice único se debe especificar UNIQUE.
8.11 TRANSACCIONES
Si una transacción tiene éxito, todas las modificaciones de los datos realizadas
durante la transacción se confirman y se convierten en una parte permanente de la
base de datos.
Las transacciones se identifican por cuatro propiedades que responden a las iniciales
ACID: Atomicidad, Coherencia, Aislamiento y Durabilidad.
Durabilidad.- Una vez que se confirma una transacción, sus efectos son
permanentes.
Donde:
nombreTransacción | @nombreVariable. Opcional, se utiliza para dar un
nombre a la transacción, es una forma de documentar el código para
facilitar el mantenimiento posterior. Puede ser un nombre o ser un nombre
contenido en una variable.
UPDATE PRODUCTOS
Para SQL la orden anterior incluye una transacción automática, es decir, cuando se
ejecuta la actualización SQL Server asume que se deben hacer los dos cambios y si por
alguna circunstancia se produjese un error, no se actualizará ninguna de las dos columnas.
Supongamos ahora que dividimos la orden anterior en dos, que hacen lo mismo, es
decir:
UPDATE PRODUCTOS
SET STOCKMINIMO=100
WHERE IDPRODUCTO=10
UPDATE PRODUCTOS
SET STOCKMAXIMO=200
WHERE IDPRODUCTO=10
Transacciones explícitas
DECLARE @MIN_ERR INT, @MAX_ERR INT -- Variables para capturar el estado de una
operación
BEGIN TRANSACTION
UPDATE PRODUCTOS -- Operación de actualización del stock mínimo
SET STOCKMINIMO=100
WHERE IDPRODUCTO=10
SET @MIN_ERR = @@ERROR -- Captura del estado de la última operación
realizada
UPDATE PRODUCTOS -- Operación de actualización del stock máximo
SET STOCKMAXIMO=200
WHERE IDPRODUCTO=10
SET @MAX_ERR = @@ERROR -- Captura del estado de la última operación
realizada
-- Si ambas operaciones han sido correctas (estado cero) se confirman las operaciones
IF (@MAX_ERR = 0 AND @MIN_ERR = 0)
COMMIT TRANSACTION -- Confirmación de la operación
-- Si alguna, o las dos, operaciones han fallado
ELSE
ROLLBACK TRANSACTION -- Se cancelan las operaciones
ROLLBACK TRANSACTION
8.20 RESUMEN
• Por regla general, en tablas que cuentan con pocas filas los índices NO mejoran mucho
el tiempo en que se ejecuta una consulta. Por el contrario, en tablas que tienen muchas
filas el índice adquiere mucha más importancia, sobre todo si las consultas a la tabla
son frecuentes.
• Cada tabla puede contar con un índice agrupado (clustered), aunque no es algo
obligatorio, así como con ninguno, uno o más índices no agrupados (non-
clustered). Dicho de otra forma, una tabla puede tener los índices que sean
necesarios, pero sólo uno de ellos puede ser un índice agrupado.
• Para crear índices se utiliza la orden CREATE INDEX, aunque también se pueden
crear índices con las restricciones de seguridad UNIQUE y PRIMARY KEY de la
sentencia CREATE TABLE, aunque estos últimos presentan algunas limitaciones.