Documentos de Académico
Documentos de Profesional
Documentos de Cultura
empId INT,
empNombre VARCHAR(1000))
Para ver como la nueva tabla no tiene ningún índice se puede ver mediante la tabla de
sistema sysindexes, esta tabla tiene una entrada para cada una de las tablas que
forma la base de datos, si la columna indid vale 0, quiere decir, que la tabla no tiene
ningún índice.
Si recuperamos los registros de la tabla mediante una SELECT, Sql Server nos los
devuelve en el mismo orden en que fueron insertados:
SELECT empID FROM empTest1
GO
Cada tabla tiene asociada unas páginas determinadas para almacenar los datos, para
saber, que páginas tiene asociadas a una tabla, tenemos el siguiente script:
DBCC TRACEON(3604)-- imprimir la salida en la ventana de consulta
GO
DECLARE @DBID Int, @TableID Int
SELECT @DBID = DB_ID(), @TableID = OBJECT_ID('empTest1')
DBCC ind(@DBID, @TableID, -1)--El comando lista todas las páginas que se asignan a
un índice
GO
De la mucha información que devuelve este script, nos interesa sólo tres columnas:
9653 0 1
9653 0 1
235512 2 10
9655 2 2
Aparecen dos registros nuevos. Las dos primeras páginas son las mismas que
cuando no teníamos índices asociados, las dos últimas contienen toda la información
del índice. Mediante el IndexID = 2, sabemos que se trata de un índice Non-Clustered.
Podemos ver el contenido de cada página, como hemos anteriormente, con el
comando DBCC page y el PagePID.
Al recuperar las páginas asociadas a la tabla, aparece una página nueva de tipo
datos. Esta página nueva de datos, contiene los registros nuevos que no cabían en la
página anterior. En la página de índice se han actualizado los punteros con los nuevos
registros, pero como todavía hay espacio no se ha creado una nueva página.
Recalcar que en la página de datos del índice, sólo aparecen los datos que han sido
indexados, no todo el registro. Además, si recuperamos los datos de la tabla mediante
una SELECT, estos continúan saliendo sin ordenar.
Añadiremos una nueva columna, sobre la que crearemos un CLUSTERED Index. En
una misma tabla tenemos un índice Clustered y Non-Clustered.
235515 1 1
235517 1 1
235518 1 2
235520 2 10
235519 2 2
Las páginas que no tenían ningún índice asociado (IndexId = 0), ahora tienen un
índice Clustered asociado (IndexId = 1, de hecho se trata de páginas nuevas). En las
páginas de datos, encontramos la información ordenada por el campo donde se ha
aplicado el Clustered Index, además cualquier inserción será ordenada según el
índice.
Si miramos que contiene cada una de sus páginas o hacemos un SELECT sobre la
tabla veremos como contiene todos los valores ordenados. En un CLUSTERED
Index sus leaf son las páginas de datos.
Clustered Index
Para ver mejor los Clustered Index, crearemos otra tabla e insertaremos registros en
en ella.
CREATE TABLE empTest2 (
EmpId INT,
EmpName VARCHAR(1000)
)
GO
INSERT INTO empTest2 VALUES (4, REPLICATE('a', 1000))
GO
INSERT INTO empTest2 VALUES (6, REPLICATE('a', 1000))
GO
INSERT INTO empTest2 VALUES (1, REPLICATE('a', 1000))
GO
INSERT INTO empTest2 VALUES (3, REPLICATE('a', 1000))
GO
Al no tener ningún indice, SQL Server almacenará los registros en el mismo orden en
que han sido insertado. Si mostramos las páginas asociadas a esta tabla:
DBCC TRACEON (3604)
GO
Declare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id('empTest2')
DBCC ind(@DBID, @TableID, -1)
GO
Las páginas asociadas a esta tabla son (sólo mostramos las columnas que nos interesa)
9653 0 1
Vamos a crear un Unique Clustered Index sobre empID, de esta forma podremos ver
como afecta a los datos almacenados en la tabla.
Si ahora, hacemos una SELECT sobre esta tabla, veremos que todos los registros
nos aparecen ordenados mediante el índice que hemos creado. Recuperemos una
vez más, las páginas asociadas a la tabla, para ver si ha habido cambios en las
páginas.
DBCC TRACEON (3604)
GO
Declare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id('empTest2')
DBCC ind(@DBID, @TableID, -1)
GO
La dos páginas que tenemos, tienen asociado un índice Clustered,. En la página de
datos encontraremos la información ordenada por ese índice.
Insertaremos más registros, para estudiar como se ven afectados estos por el
Clustered Index.
INSERT INTO empTest2 VALUES (10, REPLICATE('a', 1000))
GO
INSERT INTO empTest2 VALUES (2, REPLICATE('a', 1000))
GO
INSERT INTO empTest2 VALUES (5, REPLICATE('a', 1000))
GO
INSERT INTO empTest2 VALUES (8, REPLICATE('a', 1000))
GO
INSERT INTO empTest2 VALUES (9, REPLICATE('a', 1000))
GO
INSERT INTO empTest2 VALUES (7, REPLICATE('a', 1000))
GO
Si volvemos a listar las páginas de la tabla, tendremos más páginas debido a que una de las
páginas de datos se ha rellenado. En este caso, nos interesan más columnas que en los casos
anteriores:
9655 1 1 235521 0
235514 1 2 0 0
235521 1 1 0 9655