sql >> Base de Datos >  >> RDS >> Sqlserver

Montón de SQL Server vs. índice agrupado

El almacenamiento en montón no tiene nada que ver con estos montones .

Heap solo significa que los registros en sí mismos no están ordenados (es decir, no están vinculados entre sí).

Cuando inserta un registro, simplemente se inserta en el espacio libre que encuentra la base de datos.

La actualización de una fila en una tabla basada en montón no afecta a otros registros (aunque sí a los índices secundarios)

Si crea un índice secundario en un HEAP tabla, el RID (una especie de puntero físico al espacio de almacenamiento) se utiliza como puntero de fila.

Índice agrupado significa que los registros son parte de un B-Tree . Cuando inserta un registro, el B-Tree debe volver a vincularse.

Actualizar una fila en una tabla agrupada hace que se vuelva a vincular el B-Tree, i. mi. actualizando punteros internos en otros registros.

Si crea un índice secundario en una tabla agrupada, el valor de la clave del índice agrupado se utiliza como puntero de fila.

Esto significa que un índice agrupado debe ser único. Si un índice agrupado no es único, una columna oculta especial llamada uniquifier se adjunta a la clave de índice que hace que sea único (y de mayor tamaño).

También vale la pena señalar que la creación de un índice secundario en una columna hace que los valores o la clave del índice agrupado sean parte de la clave del índice secundario.

Al crear un índice en una tabla agrupada, de hecho siempre obtiene un índice compuesto

CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)

CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)

Índice IX_mytable_5678 es de hecho un índice en las siguientes columnas:

col5
col6
col7
col8
col1
col2
col3
col4

Esto tiene un efecto secundario más:

Un DESC condición en un índice de una sola columna en una tabla agrupada tiene sentido en SQL Server

Este índice:

CREATE INDEX IX_mytable ON mytable (col1)

se puede utilizar en una consulta como esta:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

, mientras que este:

CREATE INDEX IX_mytable ON mytable (col1 DESC)

se puede utilizar en una consulta como esta:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id DESC