jump to navigation

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))
GO

Insert Into DummyTable1 Values (6, Replicate (‘f’,2000))
GO

Insert Into DummyTable1 Values (1, Replicate (‘a’,2000))
GO

Insert 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)
GO

Declare @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)
GO

DBCC page(@DBID, 1, 26408, 3)
GO 

Al ejecutar el siguiente comando se muestra:

DBCC TRACEON (3604)
GO

dbcc 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
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd 

Record 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)
GO

Declare @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)
GO

DBCC 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

0x2967000001000000

1

26410

4

0x8F66000001000000

1

26410

6

0x8F66000001000100

La fila muestra la ubicación de estas dos maneras:

 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))
GO

Insert Into DummyTable1 Values (5, Replicate (‘e’,2000))
GO

Insert Into DummyTable1 Values (8, Replicate (‘h’,2000))
GO

Insert Into DummyTable1 Values (9, Replicate (‘i’,2000))
GO

Insert 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)
GO

Declare @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)
GO

dbcc 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

0x2967000001000000

1

26410

4

0x8F66000001000000

1

26410

5

0x2C67000001000100

1

26410

6

0x8F66000001000100

1

26410

7

0x2D67000001000000

1

26410

8

0x2C67000001000200

1

26410

9

0x2967000001000200

1

26410

10

0x2967000001000100

 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)
GO

Declare @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)
GO

DBCC 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))
GO

Insert Into DummyTable2 Values (6, Replicate (‘f’,2000))
GO

Insert Into DummyTable2 Values (1, Replicate (‘a’,2000))
GO

Insert 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)
GO

Declare @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)
GO

DBCC page(@DBID, 1, 26408, 3)
GO

La salida será la página de asignación de detalles.

DBCC TRACEON (3604)
GO

DBCC 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)
GO

Declare @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)
GO

DBCC 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)
GO

DBCC page (10, 1, 26410, 3)
GO

Estos 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))
GO

Insert Into DummyTable2 Values (2, Replicate (‘b’,2000))
GO

Insert Into DummyTable2 Values (5, Replicate (‘e’,2000))
GO

Insert Into DummyTable2 Values (8, Replicate (‘h’,2000))
GO

Insert Into DummyTable2 Values (9, Replicate (‘i’,2000))
GO

Insert Into DummyTable2 Values (7, Replicate (‘g’,2000))
GO

Ahora, la ejecución de DBCC ind (dbid, tabid, -1)

DBCC TRACEON (3604)
GO

Declare @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)
GO

dbcc 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)
GO

DBCC 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.

 

A %d blogueros les gusta esto: