msSQL – Una introducción a los índices agrupados y no agrupados de estructura de datos
Fuente: http://www.sql-server-performance.com/articles/per/index_data_structures_p1.aspx
By : G. Vijayakumar
Dec 15, 2004
Cuando empece usando SQL Server como un novato. Me fue inicialmente confuso en cuanto a las diferencias entre los índices agrupados y no agrupados. Y como desarrollador y nuevo DBA, trate de aprender de todo, sobre esos tipos de índices y cuando deberían ser utilizados. Este artículo es el resultado de mi aprendizaje y experiencia, y explica las diferencias entre índices agrupados y no agrupados datos para el DBA o desarrollador nuevo en SQL Server. Si eres nuevo en SQL Server, espero que encuentre este artículo útil.
Al leer este artículo, si lo desea, puede cortar y pegar el código que he proporcionado con el fin de comprender más plenamente y apreciar las diferencias entre índices agrupados y no agrupados.
Parte 1: Índice agrupado
Crear una Tabla
Create Table DummyTable1
(
EmpId Int,
EmpName Varchar(8000)
)
Para explicar mejor SQL Server con índices no agrupado; vamos a empezar por crear una nueva tabla y mostrar con algunos ejemplos de datos mediante los siguientes script. Supongo que usted tiene una base de datos que puede utilizar para ello. Si no, quiere crear una para estos ejemplos.
Al crear una nueva tabla, no hay ningún índice creado por defecto. En términos técnicos, una tabla sin un índice que se llama un “hearp”.
Podemos confirmar el hecho de que esta nueva tabla no tiene un índice al echar un vistazo a la tabla sistema sysindexes, en el que figura una para esta tabla con una de indid = 0. La tabla sysindexes, que existe en cada base de datos, tabla de pistas e información de índices. “Indid” se refiere al Índice de identificación, y se utiliza para identificar los índices. Un indid de 0 significa que una tabla no tiene un índice, y se guarda en SQL Server como un hearp
Ahora vamos a añadir algunos registros en esta tabla el uso de este script:
Insert Into DummyTable1 Values (4, Replicate (‘d’,2000))
GOInsert Into DummyTable1 Values (6, Replicate (‘f’,2000))
GOInsert Into DummyTable1 Values (1, Replicate (‘a’,2000))
GOInsert Into DummyTable1 Values (3, Replicate (‘c’,2000))
GO
Ahora, vamos a ver las respuestas de la tabla ejecutando el siguiente comando en el Query Analyzer para nuestra nueva tabla.
Select EmpID From DummyTable1
GO
|
Empid |
|
4 |
|
6 |
|
1 |
|
3 |
Como era de esperar, los datos insertados anteriormente ha sido expuesto. Tenga en cuenta que el orden de los resultados está en el mismo orden que he insertado en ellos, que no es en fin a todos.
Ahora, vamos a ejecutar los siguientes comandos para mostrar la información de la página real de la tabla que hemos creado y que ahora almacenan en SQL Server.
dbcc ind(dbid, tabid, -1) – Este es un comando de indocumentados.
DBCC TRACEON (3604)
GODeclare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id(‘DummyTable1′)DBCC ind(@DBID, @TableID, -1)
GO
Este script mostrará muchas columnas, pero estamos interesados en sólo tres de ellas, como se muestra a continuación.
|
PagePID |
IndexID |
PageType |
|
26408 |
0 |
10 |
|
26255 |
0 |
1 |
|
26409 |
0 |
1 |
Esto es lo que significa la información que se muestra:
PagePID es el número de página física utilizada para almacenar tablas. En este caso, tres páginas se utilizan actualmente para almacenar los datos.
IndexID es el tipo de índice,
Donde;
0 – Datapage
1 – Índice agrupado
2 – Un mayor y en condiciones de igualdad a 2 es un índice de la página (Índice no agrupado y índice ordinaria),
PageType le indica qué tipo de datos se almacenan en cada base de datos,
Dónde:
10 – IAM (Índice de Asignación MAP)
1 – Datapage
2 – Índice de la página
Ahora, vamos a ejecutar el comando DBCC PAGE. Este es un comando de indocumentados.
DBCC página (dbid, fileno, pageno, opción)
Dónde:
dbid = base de datos id.
Fileno = fileno de la página. Por lo general, que será el 1, a menos que utilicemos más de un archivo de una base de datos.
Pageno = podemos tomar la salida de la página no dbcc ind.
Opción que puede ser = 0, 1, 2, 3. Yo uso 3 para obtener una visualización de los datos. Usted puede probar con las otras opciones
Ejecutar este script para ejecutar el comando:
DBCC TRACEON (3604)
GODBCC page(@DBID, 1, 26408, 3)
GO
Al ejecutar el siguiente comando se muestra:
DBCC TRACEON (3604)
GOdbcc page(@DBID, 1, 26255, 3)
GO
Los datos se muestran en el orden en que fueron ingresados en la tabla. Así es como SQL almacena los datos en las páginas. En realidad, 26255 y 26409 ambos se muestran la página de datos.
Se muestran los datos de información de la página de la página 26255. Así es como MS SQL almacena los datos contenidos en las páginas tales como nombre de la columna con su respectivo valor.
Record Type = PRIMARY_RECORD
EmpId = 4
EmpName = ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddRecord Type = PRIMARY_RECORD
EmpId = 6
EmpName = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Record Type = PRIMARY_RECORD
EmpId = 1
EmpName = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Esto muestra exactamente el almacenamiento de datos SQL, sin ningún tipo de índice en la tabla. Ahora, vamos a ir y crear un único índice no agrupado en la columna EmpID.
La creación de un índice no agrupado
Ahora, vamos a crear un único índice no agrupado en la columna empid para ver cómo afecta a los datos, y la forma en que los datos están almacenados en SQL Server.
CREATE UNIQUE NONCLUSTERED INDEX DummyTable1_empid
ON DummyTable1 (empid)
GO
Ahora, la ejecución de DBCC ind (dbid, tabid, -1)
DBCC TRACEON (3604)
GODeclare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id(‘DummyTable1′)
DBCC ind(@DBID, @TableID, -1)
GO
Estos son los resultados:
|
PagePID |
IndexID |
PageType |
|
26408 |
0 |
10 |
|
26255 |
0 |
1 |
|
26409 |
0 |
1 |
|
26411 |
2 |
10 |
|
26410 |
2 |
2 |
Ahora, vemos dos filas más que antes, que ahora contiene detalles de la página índice. Página 26408 muestra la página de detalles de la asignación, y en las páginas 26255 y 26409 de visualización de los datos detalles de la página, como en el pasado.
En cuanto a las nuevas páginas, en la página 26411 muestra la página de detalles de la asignación de una página de índice y la página 26410 muestra el índice detalles de la página.
MS SQL genera una página (pagetype = 10) por un índice de la página y explica los detalles de la asignación de un índice. No se indica el número de página de índice que se han ocupado de un índice.
Vamos a ver cuál sería la salida para la página 26411, que es tipo de página = 10
IAM: Single Page Allocations @0x308A608E
—————————————–
Slot 0 = (1:26410)
Vamos a ver la página 26410 para ver el índice detalles de la página.
DBCC TRACEON (3604)
GODBCC page(10, 1, 26410, 3)
GO
SQL rellena el índice de la columna de datos en orden. La última columna (?) Se refirió a la fila de localización.
Estos son los resultados, utilizando dos métodos diferentes:
Método I
|
FileID |
PageID |
EMPID |
? |
|
1 |
26410 |
1 |
0x8F66000001000200 |
|
1 |
26410 |
3 |
0×2967000001000000 |
|
1 |
26410 |
4 |
0x8F66000001000000 |
|
1 |
26410 |
6 |
0x8F66000001000100 |
La fila muestra la ubicación de estas dos maneras:
- Si el cuadro no tiene un índice agrupado, la fila de localización será combinación de fileno, pageno y no de las filas de una página.
- Si la tabla tiene índice agrupado, la locación de la fila será valores de índices agrupados.
Los índices No agrupados son particularmente útiles cuando queremos regresar a una única fila de una tabla.
Los índices no agrupados son particularmente manejables cuando queremos obtener una fila simple de una tabla.
Por ejemplo, la búsqueda por el ID del empleado (empid=3) en una tabla que tiene un índice no agrupado en la columna empid, SQL Server ve por el índice para encontrar una entrada que liste las paginas exacta y filas en la tabla donde el coincidente empid puede ser encontrado, y entonces va directamente a esa página y fila. Esto acelera el acceso al registro en cuestión.
Select EmpID, EmpName From DummyTable1 WHERE EMPID = 3
Ahora, insertaremos algunas mas filas en nuestra tabla y ver los datos de página de almacenamiento muestra índice no agrupado.
Insert Into DummyTable1 Values (10, Replicate (‘j’,2000))
GO
Insert Into DummyTable1 Values (2, Replicate (‘b’,2000))
GOInsert Into DummyTable1 Values (5, Replicate (‘e’,2000))
GOInsert Into DummyTable1 Values (8, Replicate (‘h’,2000))
GOInsert Into DummyTable1 Values (9, Replicate (‘i’,2000))
GOInsert Into DummyTable1 Values (7, Replicate (‘g’,2000))
GO
Ahora observa los datos en nuestra tabla
Ejecutando:
Select EmpID From DummyTable1
Aquí están los resultados:
|
EmpID |
|
4 |
|
6 |
|
1 |
|
3 |
|
10 |
|
2 |
|
5 |
|
8 |
|
9 |
|
7 |
Cómo puedes notar arriba, los datos están en el orden de cómo lo habíamos ingresados, y en ningún orden en particular. Esto es porque agregando el índice no agrupado no cambió como el dato fue almacenado y ordenado en las páginas de datos.
Ahora vemos el resultado del comando DBCC IND. Con el fin de averiguar lo que ocurrió cuando los nuevos datos que se agregaron a la tabla.
DBCC TRACEON (3604)
GODeclare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id(‘DummyTable1′)
DBCC ind(@DBID, @TableID, -1)
GO
Aquí están los resultados
|
PagePID |
IndexID |
PageType |
|
26408 |
0 |
10 |
|
26255 |
0 |
1 |
|
26409 |
0 |
1 |
|
26412 |
0 |
1 |
|
26413 |
0 |
1 |
|
26411 |
2 |
10 |
|
26410 |
2 |
2 |
Vamos a ejecutar de nuevo la página 26410 y obtener el índice detalles de la página.
DBCC TRACEON (3604)
GOdbcc page(10, 1, 26410, 3)
GO
SQL Server llena las columnas de índices de datos en orden. La última columna(¿) apunta a la ubicacion de fila.
Aquí están los resultados.
Método 1
|
FileID |
PageID |
EMPID |
? |
|
1 |
26410 |
1 |
0x8F66000001000200 |
|
1 |
26410 |
2 |
0x2C67000001000000 |
|
1 |
26410 |
3 |
0×2967000001000000 |
|
1 |
26410 |
4 |
0x8F66000001000000 |
|
1 |
26410 |
5 |
0x2C67000001000100 |
|
1 |
26410 |
6 |
0x8F66000001000100 |
|
1 |
26410 |
7 |
0x2D67000001000000 |
|
1 |
26410 |
8 |
0x2C67000001000200 |
|
1 |
26410 |
9 |
0×2967000001000200 |
|
1 |
26410 |
10 |
0×2967000001000100 |
Como he explicado anteriormente, hay dos tipos de lugares de la fila. Hemos visto Método I. Ahora, vamos a intentar Método II con la ayuda de una tabla con índices agrupados e índices no agrupados. DummyTable1 ya no tiene un índice agrupado. Vamos a añadir ahora una nueva columna a la tabla DummyTabl1 y añadir un índice agrupado en esa columna.
Alter Table DummyTable1 Add EmpIndex Int IDENTITY(1,1)
GO
Este vínculo se agrupa en el índice de valor de clave, en lugar de la fila de localización, y se tendrá la combinación de fileno, pageno y no de registros en una página.
Esto añade la columna Empindex a DummyTable1. He utilizado una identidad columna de modo que no tendremos valores nulos en la columna.
Usted puede ejecutar el DBCC ind y DBCC página para comprobar si existe algún cambio después de la nueva columna se agregada la tabla. Si no quiere comprobar por usted mismo, le puedo decir que la adición de la nueva columna no afectó el número total de páginas que actualmente se asignan a la tabla de SQL Server.
Ahora, vamos a añadir un único índice agrupado en la columna empindex y luego ver las diferencias en la página 26410.
En primer lugar, ejecute el comando DBCC ind. Esto muestra un nuevo conjunto de páginas para dummytable1.
DBCC TRACEON (3604)
GODeclare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id(‘DummyTable1′)
DBCC ind(@DBID, @TableID, -1)
GO
Estos son los resultados:
| PagePID |
IndexID |
PageType |
| 26415 |
1 |
10 |
| 26414 |
0 |
1 |
| 26416 |
1 |
2 |
| 26417 |
0 |
1 |
| 26418 |
0 |
1 |
| 26420 |
2 |
10 |
| 26419 |
2 |
2 |
Páginas 26415 y 26420 tienen los detalles de la asignación de página. Páginas 26414, 26417 y 26418 tiene los detalles de los datos de la página.
Ahora, vamos a ver las páginas 26416 y 26419 y ver la salida.
DBCC TRACEON (3604)
GODBCC page(10, 1, 26416, 3)
GO
Estos son los resultados:
Método II
| FileID | PageID | EMPID | EMPIndex |
|
1 |
26419 | 1 | 1 |
|
1 |
26419 | 2 | 2 |
|
1 |
26419 | 3 | 3 |
|
1 |
26419 | 4 | 4 |
|
1 |
26419 | 5 | 5 |
|
1 |
26419 | 6 | 6 |
|
1 |
26419 | 7 | 7 |
|
1 |
26419 | 8 | 8 |
|
1 |
26419 | 9 | 9 |
|
1 |
26419 | 10 | 10 |
Es interesante ver las diferencias ahora. Hay una diferencia entre el Método I y el Método II. Método II actualmente está vinculado a un índice agrupado clave.
La diferencia principal entre el método I y Método II es el enlace a una fila de datos en una página.
Parte II: Indice Agrupado
Creating a Table
Para explicar mejor cómo SQL Server crea índices agrupados; vamos a empezar por crear una nueva tabla y probar con algunos ejemplos de los datos mediante los siguientes scripts. Usted puede utilizar la misma base de datos de ejemplo como antes.
Crear Tabla DummyTable2
(
EmpId Int,
EmpName Varchar(8000)
)
Como en el ejemplo anterior, la primera vez que cree una nueva tabla, no hay índice creado por defecto, y se crea un montón. Como antes, podemos confirmar el hecho de que esta nueva tabla no tiene un índice por echar un vistazo a la tabla sysindexes sistema, en el que figura una para esta tabla con una de indid = 0. La tabla sysindexes, que existe en cada base de datos, pistas de mesa y el índice de la información. “Indid” se refiere al Índice de identificación, y se utiliza para identificar los índices. Un indid de 0 significa que una tabla no tiene un índice, y se guarda en SQL Server como un montón.
Ahora vamos a añadir algunos registros en esta tabla el uso de este script:
Insert Into DummyTable2 Values (4, Replicate (‘d’,2000))
GOInsert Into DummyTable2 Values (6, Replicate (‘f’,2000))
GOInsert Into DummyTable2 Values (1, Replicate (‘a’,2000))
GOInsert Into DummyTable2 Values (3, Replicate (‘c’,2000))
GO
Ahora, vamos a ver el contenido de la tabla ejecutando el siguiente comando en el Query Analyzer para nuestra nueva tabla.
Select EmpID From DummyTable2
GO
|
Empid |
|
4 |
|
6 |
|
1 |
|
3 |
Como era de esperar, los datos insertados se han mostrado. Tenga en cuenta que el orden de los resultados está en el mismo orden que he insertado en ellos, que no es en fin a todos.
Ahora, vamos a ejecutar los siguientes comandos para mostrar la información de la página real de la tabla que hemos creado y que ahora almacenan en SQL Server.
DBCC ind(dbid, tabid, -1) – It is an undocumented command.
DBCC TRACEON (3604)
GODeclare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id(‘DummyTable2′)
DBCC ind(@DBID, @TableID, -1)
GO
Este script mostrará muchas columnas, pero estamos interesados en sólo tres de ellos, como se muestra a continuación.
Estos son los resultados:
|
PagePID |
IndexID |
PageType |
|
26408 |
0 |
10 |
|
26255 |
0 |
1 |
|
26409 |
0 |
1 |
Esto es lo que significa de la información que se muestra:
PagePID es la página física utilizada para almacenar números de la tabla. En este caso, de tres páginas se utilizan actualmente para almacenar los datos.
IndexID es el tipo de índice,
Dónde:
0 – Datapage
1 – Índice agrupado
2 – Una mayor y en condiciones de igualdad a 2 es un índice de la página (índice no agrupado y ordinaria índice).
PageType le indica qué tipo de datos se almacenan en cada base de datos
Dónde:
10 – IAM (Índice de Asignación MAP)
1 – Datapage
2 – Índice de la página
Ahora, vamos a ejecutar DBCC PAGE comando.
DBCC página (dbid, fileno, pageno, opción)
Dónde:
Dbid = base de datos de identificación.
Fileno = fileno de la página. Por lo general, que será el 1, a menos que utilicemos más de un archivo para una base de datos.
Pageno = podemos tomar la salida de la página no dbcc ind.
Opción que puede ser = 0, 1, 2, 3. Yo uso 3 para obtener una visualización de los datos. Puede probar para las otras opciones.
Ejecutar este script para ejecutar el comando:
DBCC TRACEON (3604)
GODBCC page(@DBID, 1, 26408, 3)
GOLa salida será la página de asignación de detalles.
DBCC TRACEON (3604)
GODBCC page(@DBID, 1, 26255, 3)
GO
La salida de datos mostrará la manera en que se inscribió en la tabla. Así es como SQL almacena los datos en las páginas. En realidad, 26255 y 26409 se mostrarán la página de datos.
Me han dado muestras de los datos de información de la página de la página 26255. Así es como MS-SQL almacena los datos contenidos en las páginas tales como nombre de la columna con su respectivo valor.
Record Type = PRIMARY_RECORD
EmpId = 4
EmpName = dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
Record Type = PRIMARY_RECORD
EmpId = 6
EmpName = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Record Type = PRIMARY_RECORD
EmpId = 1
EmpName = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Esto muestra exactamente el almacenamiento de datos SQL sin ningún tipo de índice en la tabla. Ahora, vamos a ir y crear un único índice agrupado en la columna EmpID.
Crear un Índice agrupado
Ahora, vamos a crear un único índice agrupado en la columna empid para ver cómo afecta a los datos que se almacenan en SQL Server.
CREATE UNIQUE CLUSTERED INDEX DummyTable2_EmpIndex
ON DummyTable2 (EmpID)
GO
Ejecutando
Select EmpID From DummyTable2
Estos son los resultados
|
Empid |
|
1 |
|
3 |
|
4 |
|
6 |
Ahora, la ejecución de DBCC ind (dbid, tabid, -1)
DBCC TRACEON (3604)
GODeclare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id(‘DummyTable2′)
DBCC ind(@DBID, @TableID, -1)
GO
Estos son los resultados:
|
PagePID |
IndexID |
PageType |
|
26411 |
1 |
10 |
|
26410 |
0 |
1 |
|
26412 |
1 |
2 |
MS SQL genera una página (pagetype = 10) por un índice de la página y explica los detalles de la asignación de un índice. No se indica el número de página de índice que se han ocupado de un índice.
Ahora, vamos a ver la página 26410 y 26412 y ver los detalles de la página.
DBCC TRACEON (3604)
GODBCC page(10, 1, 26412, 3)
GO
Estos son los resultados:
|
FileID |
PageID |
ChildPageID |
EMPID |
|
1 |
26412 |
26410 |
0 |
La salida muestra muchas columnas, pero estamos interesados en sólo cuatro de ellas como se muestra arriba.
Esto mostrará la salida de la página de índice, que tiene enlace con la página de datos (ChildPageID). EMPID es una columna con un índice que contendrá la fila a partir de la página.
Ahora, vamos a ver la página 26410 y ver los detalles de la página.
DBCC TRACEON (3604)
GODBCC page (10, 1, 26410, 3)
GOEstos son los resultados:
Record Type = PRIMARY_RECORD
EmpId = 1
EmpName =
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Record Type = PRIMARY_RECORD
EmpId = 2
EmpName = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Record Type = PRIMARY_RECORD
EmpId = 3
EmpName = cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
Aunque he añadido registros distorsionados, SQL ha dado muestras de la secuencia de datos en la página, porque hemos conseguido un índice agrupado en empid. Esto es absolutamente genial! Añadiendo un índice agrupado a la tabla se está reordenando físicamente las páginas de los datos, poniéndolos en el orden físico basado en la columna indexada.
Ahora, vamos a insertar algunas filas más en nuestra tabla y ver los datos y la página de índice de almacenamiento de nuestro índice agrupado.
Insert Into DummyTable2 Values (10, Replicate (‘j’,2000))
GOInsert Into DummyTable2 Values (2, Replicate (‘b’,2000))
GOInsert Into DummyTable2 Values (5, Replicate (‘e’,2000))
GOInsert Into DummyTable2 Values (8, Replicate (‘h’,2000))
GOInsert Into DummyTable2 Values (9, Replicate (‘i’,2000))
GOInsert Into DummyTable2 Values (7, Replicate (‘g’,2000))
GO
Ahora, la ejecución de DBCC ind (dbid, tabid, -1)
DBCC TRACEON (3604)
GODeclare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id(‘DummyTable2′)
DBCC ind(@DBID, @TableID, -1)
GO
Aquí están los resultados:
|
PagePID |
IndexID |
PageType |
|
26411 |
1 |
10 |
|
26410 |
0 |
1 |
|
26412 |
1 |
2 |
|
26255 |
0 |
1 |
|
26408 |
0 |
1 |
|
26409 |
0 |
1 |
Ahora, vemos pocas filas más que antes. Página 26411 muestra la página de detalles de la asignación, y en las páginas 26408, 26409, 26410 y 26255 de visualización de los datos detalles de la página, como antes.
En cuanto a las nuevas páginas, en la página 26411 muestra los detalles de la asignación de página de una página indexada y la página 26412 muestra los detalles de la página indexada.
MS-SQL genera una página (pagetype = 10) por un índice de la página y explica los detalles de la asignación de un índice. No se indica el número de página de índice que se han ocupado de un índice.
Vamos a ver cuál sería la salida para la página 26411, que es tipo de página = 10.
DBCC TRACEON (3604)
GOdbcc page(10, 1, 26411, 3)
GO
Estos son los resultados:
IAM: Single Page Allocations @0x30A5C08E
—————————————–
Slot 0 = (1:26410)
Slot 1 = (1:26412)
Slot 2 = (1:26255)
Slot 3 = (1:26408 )
Slot 4 = (1:26409)
Vamos a ver la página 26412 para ver los detalles de la página índice.
DBCC TRACEON (3604)
GODBCC page(10, 1, 26412, 3)
GO
Estos son los resultados:
|
FileID |
PageID |
ChildPageID |
EMPID |
|
1 |
26412 |
26410 |
0 |
|
1 |
26412 |
26408 |
4 |
|
1 |
26412 |
26255 |
6 |
|
1 |
26412 |
26409 |
9 |
Esto nos ayuda a tener una idea para decidir la necesidad de un índice agrupado. Es realmente útil disponer de un índice agrupado al recuperar muchos registros del datos, rangos de datos, y Cuando el BETWEEN es usado en la clausula WHERE. Porque, el nivel de la hoja índice se agrupan los datos. Debería usarse para salvar muchas I / O. Por lo tanto, es mejor utilizar los índices en cluster para resolver las preguntas pidiendo rangos de datos, no de una fila.
Por ejemplo, para buscar un empleado ID (empid entre 3 y 9) en una tabla que tiene un índice agrupado en la columna empid.
Select EmpID, EmpName From DummyTable1 WHEREEMPID Between 3 And 9
NOTA: G. Vijayakumar ha trabajado en el cliente y el servidor de aplicaciones Web. Actualmente está trabajando para Transworld, que se encuentra en Bangalore, India, que trabajan en un e-producto bancario
Comentarios ( Abril 2008 )
Paola Fujii
German Flores
Adrian Migliardi
Juan Grabosh
Diego Higa
Pablo S. de las Heras
Alejandra Godoy
Los métodos de particionamiento proveen un mejor rendimiento de los recursos, dándole al usuario una rápida obtención de datos y en forma concurrente.
Se es recomendable utilizarlo en tablas donde ocupen más de 2GB y las que mantienen un histórico, tales como en los Datawarehouse.
La diferencia entre un índice agrupado y uno no agrupado en SQL server es que:
- Solo puede existir un índice por tabla en el caso de los agrupados y en este caso se ordenan directamente los archivos de datos con relación a ese índice, es decir que si hace un select y luego se lo compara con la vista física real de los mismos ambas coinciden
- En el caso de los índices no agrupado las páginas de datos se mantienen almacenados en el orden en que fueron cargados y las búsquedas se realizan accediendo a una estructura de datos que se guarda aparte que son los índices.
La estructura que se elija depende de la implementación del server pero pueden utilizarse por ejemplo arboles o demás. De esta forma cada elemento de esta estructura de datos apuntara a la página de datos correspondiente y de esa forma podrán listarse por ejemplo o buscar un dato en forma más optima buscando en esa estructura.
Bocca Gabriel Mat: 3301-2020
Holubika Guido Mat: 3101-1731
Máspero Silvia Mat: 3101-1576
Mazzalai Rubén Mat: 1328-0238
Paccioretti Claudio Mat: 3301-1608
En un principio el artículo nos explica cómo crear los distintos tipos de índices de una manera simple con ejemplos para que podamos probar que sucedería en cada caso y los posibles resultados que podremos obtener al realizar lo propuesto.
Después nos expone diferentes métodos para utilizar los índices agrupados o no agrupados y las diferentes situaciones que podemos encontrarnos al intentarlo.
Lo más importante del artículo es que nos demuestra las ventajas de utilizar índices agrupados, que siendo pocas las excepciones, todas las tablas deben tener un índice agrupado. Además de mejorar el rendimiento de las consultas, un índice agrupado se puede volver a generar o reorganizar a petición para controlar la fragmentación de las tablas. También se puede crear un índice agrupado en una vista.
Por otro lado se pueden crear varios índices no agrupados en una tabla. Normalmente, los índices no agrupados se crean para mejorar el rendimiento de las consultas usadas con frecuencia y que no cubre el índice agrupado.
También a la hora de crear un índice en una tabla vacía esto no producirá problemas de rendimiento en el momento de creación del índice; sin embargo, el rendimiento se verá afectado cuando se agreguen los datos a la tabla.
La creación de índices en tablas grandes debe planearse con cuidado para que el rendimiento de la base de datos no se vea afectado. La mejor manera de crear índices en tablas de gran tamaño es empezar con el índice agrupado y, a continuación, generar los índices no agrupados.
Fernandez, Santiago 3401-1570
Gricar, Francisco 3401-2219
Kambic, Gastin 3401-0191
De La Vecchia, Martin 3401-1366
Gonzalez, Matias 3301-2528
Caserta, Nicolas 3401-1131
Esto nos ayuda al tener una idea para decidir la necesidad de índices cluster. Es realmente util tener un índice cluster cuando recuperamos muchas filas de datos, rangos de datos, y cuando el BETWEEN es usado en la condición WHERE. Como, el nivel de hojas del índice cluster es la información, debería ser utilizado para guardar muchas I/Os. Entonces, es mejor usar índices cluster para resolver consultas para rangos de datos, no una fila.
Por ende, los índices cluster son muy útiles para las columnas que son muy consultadas por algún rango, o accesadas en orden ascendente o descendente.
Por otra parte, los índices non cluster son muy útiles cuando el usuario requiere accesar la información de múltiples maneras.