Definición
En SQL Server las tablas pueden tener o no tener un índice clustered.
El índice clustered es por el que SQL ordena físicamente los
datos (las filas de las tablas) en disco.
El índice clustered le sirve a SQL para buscar,
ordenar y agrupar registros de manera eficiente. Así, no tener un índice clustered
en una tabla puede llevarnos a problemas de rendimiento. Cuando una
tabla no tiene índice clustered, se llama heap.
El problema
Los heaps mantienen los registros en las páginas de datos en el mismo orden en el que se han insertado. Esto hace que los heaps resulten más rápidos a la hora de realizar un INSERT, ya que no han de insertarse en una posición en concreto, sino directamente a continuación del último registro existente para la tabla en cuestión.
Sin embargo, cualquier otra operación que requiera un orden en los datos será más lenta. Esto se aplica a SELECT, DELETE y UPDATE, salvo que se quieran efectuar estas operaciones sobre la tabla completa.
- A veces, hay buenos motivos para dejar una tabla como heap en lugar de crear un índice clustered, pero para usar los heaps de forma eficaz se requieren conocimientos avanzados. La mayoría de las tablas deben tener un índice clustered cuidadosamente elegido.
- Si una tabla es un heap y no tiene ningún índice no clustered, debe examinarse la tabla completa (table scan) cuando se busca una fila.
En cualquier otro caso, cualquier consulta sobre una tabla sin índice clustered obligará a SQL Server a recorrer la tabla entera en busca del registro o registros solicitados. Evidentemente, cuanto mayor sea la tabla, mayor será el problema de rendimiento que esta situación puede generar.
Cómo detectarlo
El script a continuación ayuda a detectar heaps en
nuestras bases de datos:
SELECT
OBJECT_NAME(i.object_id) AS TableName, p.rows
FROM
sys.indexes i
INNER
JOIN sys.partitions p ON p.object_id = i.object_id AND p.index_id = i.index_id
WHERE
i.index_id = 0
ORDER
BY p.rows DESC
La solución
En general, con cada heap hay que pararse y
determinar cuál debería ser su índice clustered. El candidato más
idóneo para ser índice clustered suele ser siempre la clave primaria,
aunque existen excepciones. Si la tabla sólo tiene clave primaria, ésta debe
ser clustered siempre. El resto de los casos podemos estudiarlo, aunque
existen algunas directrices:
- Suelen ser los campos que usamos para hacer búsquedas y joins sobre la tabla.
- Suelen ser los campos por los que se referencia a la tabla desde otras tablas.
- Hay que intentar que el índice clustered de una tabla tenga el mínimo tamaño posible.
Todo esto señala, como decíamos, a la clave primaria de la tabla. Pero, en ocasiones, creamos claves alternativas a la primaria que se ajustan mejor a esta definición.
Referencias:
- Tables without clustered indexes, por Basit Farooq. Basit nos ofrece scripts alternativos para detectar heaps basados en su utilización
- Blitz Results: Tables without clustered indexes, por Brent Ozar.
Buena explicacion
ResponderEliminarGracias, Ricardo
EliminarGENIAL, gracias!!
ResponderEliminarA ti.
Eliminar