07 sql 2005 indices

Upload: andres-teran

Post on 09-Jul-2015

152 views

Category:

Documents


0 download

TRANSCRIPT

BASES DE DATOS II

1

SQL Server 2005INDICESUn ndice es una estructura de disco asociada con una tabla o una vista que acelera la recuperacin de filas de la tabla o de la vista. Un ndice contiene claves generadas a partir de una o varias columnas de la tabla o la vista. Dichas claves estn almacenadas en una estructura (rbol b) que permite que SQL Server busque de forma rpida y eficiente la fila o filas asociadas a los valores de cada clave. En la tabla siguiente se indican los tipos de ndice disponibles en SQL Server 2005 y se proporcionan vnculos a informacin adicional. Tipo de ndice Agrupado Descripcin Un ndice agrupado ordena y almacena las filas de datos de la tabla o vista por orden en funcin de la clave del ndice agrupado. El ndice agrupado se implementa como una estructura de rbol b que admite la recuperacin rpida de las filas a partir de los valores de las claves del ndice agrupado. Los ndices no agrupados se pueden definir en una tabla o vista con un ndice agrupado o en un montn. Cada fila del ndice no agrupado contiene un valor de clave no agrupada y un localizador de fila. Este localizador apunta a la fila de datos del ndice agrupado o el montn que contiene el valor de clave. Las filas del ndice se almacenan en el mismo orden que los valores de la clave del ndice, pero no se garantiza que las filas de datos estn en un determinado orden a menos que se cree un ndice agrupado en la tabla. Un ndice nico garantiza que la clave de ndice no contenga valores duplicados y, por tanto, cada fila de la tabla o vista es en cierta forma nica. Tanto los ndices agrupados como los no agrupados pueden ser nicos. ndice con columnas incluidas ndice no agrupado que se extiende para incluir columnas sin clave adems de las columnas de clave. Un ndice en una vista materializa (ejecuta) la vista, y el conjunto de resultados se almacena de forma permanente en un ndice agrupado nico, del mismo modo que se almacena una tabla con un ndice agrupado. Los ndices no agrupados de la vista se pueden agregar una vez creado el ndice agrupado. Tipo especial de ndice funcional basado en smbolos (token) que crea y mantiene el servicio del Motor de texto completo de Microsoft para SQL Server (MSFTESQL). Proporciona la compatibilidad adecuada para bsquedas de texto complejas en datos de cadenas de caracteres. Representacin dividida y permanente de los objetos XML binarios grandes (BLOB) de la columna de tipo de datos xml.

No agrupado

nico

Vistas indizadas

Texto

XML

INDICES AGRUPADOSLos ndices agrupados ordenan y almacenan las filas de los datos de la tabla de acuerdo con los valores de la clave del ndice. Slo puede haber un ndice agrupado por cada tabla, porque las filas de datos slo pueden estar ordenadas de una forma. Salvo excepciones, todas las

Ing. Rosa Navarrete

BASES DE DATOS II

2

tablas deben incluir un ndice agrupado definido en las columnas que cuentan con las siguientes caractersticas: Se pueden utilizar en consultas frecuentes. Proporcionan un alto grado de unicidad. Se pueden utilizar en consultas de intervalo.

Nota: Cuando crea una restriccin PRIMARY KEY, se crea automticamente un ndice nico en las columnas. De forma predeterminada, este ndice est agrupado; sin embargo, puede especificar un ndice no agrupado cuando crea la restriccin. Si el ndice agrupado no se crea con la propiedad UNIQUE, Database Engine (Motor de base de datos) agrega automticamente una columna de unicidad de 4 bytes a la tabla. Cuando se necesita, Database Engine (Motor de base de datos) agrega automticamente un valor de unicidad a una fila para que cada clave sea nica. Esta columna y sus valores se utilizan de forma interna; los usuarios no pueden verlos ni tener acceso a ellos. Consideraciones sobre las consultas Antes de crear ndices agrupados, debe conocer cmo se tiene acceso a los datos. Considere que utiliza un ndice agrupado en consultas que realizan lo siguiente: Devuelven un intervalo de valores mediante la utilizacin de operadores como BETWEEN, >, >=, < y 30% ALTER INDEX REBUILD WITH (ONLINE = ON)*

Ing. Rosa Navarrete

BASES DE DATOS II

12

*La reorganizacin de un ndice siempre se realiza en lnea, aunque su reconstitucin se pueda realizar tanto en lnea como sin conexin. Para lograr una disponibilidad similar a la opcin de reorganizacin, debe volver a generar los ndices en lnea. Por ejemplo, ejecute la siguiente instruccin. Copiar cdigo USE AdventureWorks; GO SELECT a.index_id, name, avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(N'Production.Product'), NULL, NULL, NULL) AS a JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id; GO La instruccin probablemente devolver un conjunto de resultados similar al que sigue. Copiar cdigo index_id name avg_fragmentation_in_percent ----------- --------------------------- ---------------------------1 PK_Product_ProductID 23.076923076923077 2 AK_Product_ProductNumber 50.0 3 AK_Product_Name 66.666666666666657 4 AK_Product_rowguid 50.0 (4 row(s) affected) Si utiliza la tabla anterior, la solucin recomendada es reorganizar PK_Product_ProductID y volver a generar los otros ndices. Para detectar la fragmentacin, se debe utilizar la funcin de administracin dinmica sys.dm_db_index_physical_stats en lugar de DBCC SHOWCONTIG. Reorganizar un ndice Para reorganizar uno o ms ndices, utilice la instruccin ALTER INDEX con la clusula REORGANIZE. Esta instruccin reemplaza la instruccin DBCC INDEXDEFRAG. Para reorganizar una sola particin de un ndice con particiones, utilice la clusula PARTITION de ALTER INDEX. La reorganizacin de un ndice desfragmenta el nivel hoja de ndices agrupados y no agrupados en tablas y vistas volviendo a ordenar fsicamente las pginas en el nivel hoja de manera que coincidan con la ordenacin lgica (de izquierda a derecha) de los nodos hoja. La ordenacin de las pginas mejora el rendimiento de recorrido del ndice. El ndice se reorganiza dentro de las pginas existentes que se le han asignado; no se le asignan pginas nuevas. Si un ndice abarca ms de un archivo, los archivos se reorganizan de uno en uno. Las pginas no migran entre archivos. La reorganizacin tambin compacta las pginas del ndice. Todas las pginas vacas que se crean como consecuencia de esta compactacin se eliminan para proporcionar una mayor cantidad de espacio en el disco duro. La compactacin se basa en el valor de factor de relleno de la vista de catlogo sys.indexes. El proceso de reorganizacin utiliza una mnima cantidad de recursos del sistema. Adems, la reorganizacin se realiza automticamente en lnea. El proceso no mantiene bloqueos durante mucho tiempo y, por lo tanto, no bloquea las consultas ni las actualizaciones en ejecucin.

Ing. Rosa Navarrete

BASES DE DATOS II

13

Reorganice un ndice cuando ste no est demasiado fragmentado. Vea la tabla anterior para obtener instrucciones para la fragmentacin. No obstante, si el ndice est muy fragmentado, obtendr mejores resultados si lo vuelve a generar. Compactar tipos de datos de objetos grandes Adems de reorganizar uno o ms ndices, los tipos de datos de objetos grandes (LOB) contenidos en el ndice agrupado o en la tabla subyacente se compactan de manera predeterminada cada vez que se reorganiza un ndice. Los tipos de datos image, text, ntext, varchar(max), nvarchar(max), varbinary(max) y xml son tipos de datos de objetos grandes. La compactacin de estos datos puede optimizar el uso del espacio en el disco duro. La reorganizacin de un ndice agrupado en particular permitir compactar todas las columnas de LOB contenidas en el nivel hoja (filas de datos) de ese ndice agrupado. La reorganizacin de un ndice no agrupado permitir compactar todas las columnas de LOB que constituyen columnas sin clave (incluidas) en el ndice. Si se especifica ALL, se reorganizan todos los ndices asociados a la tabla o vista especificada y se compactan todas las columnas de LOB asociadas al ndice agrupado, a la tabla subyacente o al ndice no agrupado con columnas incluidas. Si no existen columnas LOB, la clusula LOB_COMPACTION se omite.

Volver a generar un ndice Cuando se vuelve a generar un ndice, se quita el ndice anterior y se crea uno nuevo. Al hacerlo, se elimina la fragmentacin, se recupera el espacio en el disco duro compactando pginas mediante la configuracin especificada o existente del factor de relleno y se reordenan las filas de ndices en las pginas contiguas (se asignan pginas nuevas segn sea necesario). Esto puede mejorar el rendimiento del disco, reduciendo el nmero de lecturas de pgina necesarias para obtener los datos solicitados. Para volver a generar ndices agrupados y no agrupados, se pueden utilizar los siguientes mtodos: ALTER INDEX con la clusula REBUILD. Esto reemplaza DBCC DBREINDEX. CREATE INDEX con la clusula DROP_EXISTING.

Cada mtodo realiza la misma funcin, pero es preciso considerar algunas ventajas y desventajas tal como se muestran en la siguiente tabla. Funcionalidad La definicin del ndice se puede cambiar agregando o eliminando columnas de clave, cambiando la ordenacin de las columnas o modificando el criterio de ordenacin de columnas.* ALTER INDEX REBUILD CREATE INDEX WITH DROP_EXISTING

No

S**

Las opciones del ndice se pueden establecer o S modificar. Se puede volver a generar ms de un ndice en S una sola transaccin.

S

No

Ing. Rosa Navarrete

BASES DE DATOS II

14

La mayora de los tipos de ndices se puede volver a generar sin necesidad de bloquear consultas ni actualizaciones en ejecucin. Se pueden volver a crear particiones en los ndices con particiones. El ndice se puede mover a otro grupo de archivos. Se necesita ms espacio temporal en disco.

S

S

No

S

No S No

S S No

Si se vuelve a generar un ndice agrupado, se vuelven a generar ndices no agrupados asociados.

A menos que se A menos que se haya haya especificado la cambiado la definicin palabra clave ALL. del ndice.

Los ndices que aplican las restricciones PRIMARY KEY y UNIQUE se pueden volver a S generar sin necesidad de quitar ni volver a crear las restricciones. La particin de un solo ndice se puede volver a S generar.

S

No

*Un ndice no agrupado se puede convertir en un tipo de ndice agrupado si se especifica CLUSTERED en la definicin del ndice. Esta operacin se debe realizar con la opcin ONLINE establecida en OFF. La conversin de agrupado a no agrupado no es compatible independientemente de la configuracin de ONLINE. **Si se vuelve a crear el ndice con el mismo nombre, las mismas columnas y el mismo criterio de ordenacin, posiblemente se omita la operacin de ordenacin. Cuando se vuelve a generar el ndice, se comprueba que las filas estn ordenadas mientras se genera el ndice. Tambin se puede volver a generar un ndice quitando el ndice con la instruccin DROP INDEX y volvindolo a crear con una instruccin CREATE INDEX individual. Realizar estas operaciones como instrucciones individuales presenta varias desventajas, por lo cual no se recomienda esta prctica. Deshabilitar ndices no agrupados para reducir el espacio en el disco durante operaciones de regeneracin Cuando se deshabilita un ndice no agrupado, se eliminan las filas de datos del ndice, aunque la definicin del ndice permanece en los metadatos. El ndice se habilita cuando se vuelve a generar. Cuando no se deshabilita el ndice no agrupado, la operacin de regeneracin requiere una cantidad suficiente de espacio temporal en el disco para almacenar el ndice anterior y el nuevo. Sin embargo, si se deshabilita y se vuelve a generar un ndice no agrupado en transacciones individuales, la regeneracin subsiguiente o cualquier otra operacin puede volver a utilizar el espacio en disco liberado al deshabilitar el ndice. No se requiere espacio adicional, excepto el espacio temporal en disco necesario para la ordenacin. Normalmente, es el 20 por ciento del tamao del ndice. Si el ndice no agrupado est en la clave principal, se deshabilitar automticamente cualquier restriccin FOREIGN KEY activa a la que se haga referencia. Estas restricciones se deben habilitar manualmente despus de que se vuelva a generar el ndice.

Ing. Rosa Navarrete

BASES DE DATOS II

15

Volver a generar ndices grandes Los ndices que tienen ms de 128 extensiones se vuelven a generar en dos fases individuales: lgica y fsica. En la fase lgica, las unidades de asignacin existentes que utiliza el ndice estn sealadas para cancelacin de asignacin. En la fase fsica, las unidades de asignacin previamente sealadas para cancelacin de asignacin se quitan fsicamente de las transacciones breves que se realizan en segundo plano y no requieren demasiados bloqueos. Configurar opciones del ndice Las opciones del ndice no se pueden especificar al reorganizar un ndice. Sin embargo, las siguientes opciones del ndice se pueden establecer cuando vuelve a generar un ndice utilizando ALTER INDEX REBUILD o CREATE INDEX WITH DROP_EXISTING: PAD_INDEX FILLFACTOR SORT_IN_TEMPDB IGNORE_DUP_KEY STATISTICS_NORECOMPUTE DROP_EXISTING (slo CREATE INDEX) ONLINE ALLOW_ROW_LOCKS ALLOW_PAGE_LOCKS MAXDOP

Nota: Si no se necesita una operacin de ordenacin o si la ordenacin se puede realizar en la memoria, se omite la opcin SORT_IN_TEMPDB. Adems, la clusula SET de la instruccin ALTER INDEX permite establecer las siguientes opciones del ndice sin necesidad de volver a generarlo: ALLOW_PAGE_LOCKS ALLOW_ROW_LOCKS IGNORE_DUP_KEY STATISTICS_NORECOMPUTE

Para volver a generar o reorganizar un ndice ALTER INDEX (Transact-SQL) Para volver a generar un ndice quitando y volviendo a crear el ndice en un solo paso CREATE INDEX (Transact-SQL)

Ejemplos

Ing. Rosa Navarrete

BASES DE DATOS II

16

A. Volver a generar un ndice En el siguiente ejemplo, se vuelve a generar un solo ndice. Copiar cdigo USE AdventureWorks; GO ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD; GO B. Volver a generar todos los ndices de una tabla especificando las opciones En el siguiente ejemplo, se especifica la palabra clave ALL. Con ella, se vuelven a generar todos los ndices asociados a la tabla. Se especifican tres opciones. Copiar cdigo USE AdventureWorks; GO ALTER INDEX ALL ON Production.Product REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON); GO C. Reorganizar un ndice con compactacin de LOB En el siguiente ejemplo, se reorganiza un solo ndice agrupado. Dado que el ndice contiene un tipo de datos de LOB en el nivel hoja, la instruccin tambin compacta todas las pginas que contienen datos de objetos grandes. Tenga en cuenta que no debe especificar la opcin WITH (LOB_Compaction) porque el valor predeterminado es ON. Copiar cdigo USE AdventureWorks; GO ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto REORGANIZE ; GO

Cmo utiliza los ndices el optimizador de consultas Los ndices bien diseados pueden reducir las operaciones de E/S de disco y consumen menos recursos del sistema, con lo que mejoran el rendimiento de la consulta. Los ndices pueden ser tiles para varias consultas que contienen instrucciones SELECT, UPDATE o DELETE. Fjese en la consulta SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 en la base de datos AdventureWorks. Cuando se ejecuta la consulta, el optimizador de consultas evala cada mtodo disponible para recuperar datos y selecciona el mtodo ms eficiente. El mtodo puede ser un recorrido de la tabla o puede ser recorrer uno o ms ndices si existen. Al realizar un recorrido de la tabla, el optimizador de consultas leer todas las filas de la tabla y extraer las filas que cumplen con los criterios de la consulta. Un recorrido de la tabla genera muchas operaciones de E/S de disco y puede consumir recursos. No obstante, puede ser el mtodo ms eficaz si, por ejemplo, el conjunto de resultados de la consulta es un porcentaje elevado de filas de la tabla.

Ing. Rosa Navarrete

BASES DE DATOS II

17

Cuando el optimizador de consultas utiliza un ndice, busca en las columnas de clave de ndice, busca la ubicacin de almacenamiento de las filas que necesita la consulta y extrae las filas coincidentes de esa ubicacin. Generalmente, la bsqueda del ndice es mucho ms rpida que la bsqueda de la tabla porque, a diferencia de la tabla, un ndice frecuentemente contiene muy pocas columnas por fila y las filas estn ordenadas. El optimizador de consultas normalmente selecciona el mtodo ms eficaz cuando ejecuta consultas. No obstante, si no hay ndices disponibles, el optimizador de consultas debe utilizar un recorrido de la tabla. Su tarea es disear y crear los ndices ms apropiados para su entorno de forma que el optimizador de consultas tenga una seleccin de ndices eficaces entre los que elegir. SQL Server 2005 proporciona el Asistente para la optimizacin de motor de base de datos para ayudar con el anlisis del entorno de la base de datos y en la seleccin de los ndices adecuados.

ARQUITECTURA DE TABLAS E INDICES

ORGANIZACIN DE TABLAS E INDICES

Las tablas y los ndices se almacenan como una coleccin de pginas de 8 KB. En este tema se describe el modo en el que se organizan las pginas de tablas e ndices. Organizacin de tablas En la siguiente ilustracin se muestra la organizacin de una tabla. Una tabla est incluida en una o varias particiones y cada particin incluye filas de datos con una estructura de ndice agrupado o de montn. Las pginas del ndice agrupado o de montn se administran en una o varias unidades de asignacin, segn los tipos de columna de las filas de datos.

Ing. Rosa Navarrete

BASES DE DATOS II

18

Particiones En SQL Server 2005, las pginas de tablas e ndices estn incluidas en una o varias particiones. Una particin es una unidad de organizacin de datos definida por el usuario. De forma predeterminada, una tabla o un ndice slo incluyen una particin que contiene todas las pginas de tablas o ndices. La particin se encuentra en un solo grupo de archivos. Una tabla o un ndice con una sola particin es equivalente a la estructura organizativa de las tablas y los ndices de versiones anteriores de SQL Server. Cuando una tabla o un ndice utilizan varias particiones, se crean particiones horizontales de los datos para que se asignen los grupos de filas a particiones individuales, en funcin de la columna especificada. Las particiones se pueden colocar en uno o varios grupos de archivos de la base de datos. La tabla o el ndice se tratarn como una sola entidad lgica cuando se realicen consultas o actualizaciones en los datos. Para ver las particiones utilizadas por una tabla o un ndice, utilice la vista de catlogo sys.partitions (Transact-SQL).

Tablas, montones e ndices agrupados Las tablas de SQL Server 2005 utilizan uno de estos dos mtodos para organizar sus pginas de datos en una particin: Las tablas agrupadas son tablas que tienen un ndice agrupado. Las filas de datos estn almacenadas en un orden basado en la clave del ndice agrupado. El ndice agrupado se implementa como una estructura de rbol b que admite la recuperacin rpida de las filas a partir de los valores de las claves del ndice agrupado. Las pginas de cada nivel del ndice, incluidas las pginas de datos del nivel hoja, se vinculan en una lista con vnculos dobles. Sin embargo, el desplazamiento de un nivel a otro se produce mediante valores de claves. Los montones son tablas que no tienen ningn ndice agrupado. Las filas de datos no se almacenan en ningn orden concreto, ni tampoco hay un orden concreto en la secuencia de las pginas de datos. Las pginas de datos no estn vinculadas en una lista vinculada. Las vistas indizadas tienen la misma estructura de almacenamiento que las tablas agrupadas. Cuando un montn o una tabla agrupada tienen varias particiones, cada una de ellas tiene una estructura de montn o de rbol b que incluye el grupo de filas de esa particin especfica. Por ejemplo, si una tabla agrupada tiene cuatro particiones, hay cuatro rboles b, uno en cada particin. ndices no agrupados Los ndices no agrupados tienen una estructura de rbol b similar a la de los ndices agrupados. La diferencia est en que los ndices no agrupados no tienen ningn efecto en el orden de las filas de datos. El nivel hoja contiene las filas del ndice. Cada fila del ndice contiene el valor de clave no agrupada, un localizador de filas y columnas incluidas o sin clave. El localizador apunta a la fila de datos que incluye el valor de clave.

Ing. Rosa Navarrete

BASES DE DATOS II

19

ndices XML En cada columna xml de la tabla se puede crear un ndice XML principal y varios secundarios. Un ndice XML es una representacin dividida y persistente de los objetos binarios grandes (BLOB) XML de la columna de tipo de datos xml. Los ndices XML se almacenan como tablas internas. Para ver informacin acerca de los ndices xml, utilice las vistas de catlogo sys.xml_indexes o sys.internal_tables. Unidades de asignacin Una unidad de asignacin es una coleccin de pginas de un montn o un rbol b utilizada para administrar los datos segn su tipo de pgina. En la tabla siguiente se enumeran los tipos de unidades de asignacin que se utilizan para administrar los datos en tablas e ndices. Tipo de unidad de asignacin IN_ROW_DATA Se utiliza para administrar Filas de datos o ndices que incluyen todos los tipos de datos excepto los datos de objetos grandes (LOB). Las pginas son del tipo datos o ndice. Datos de objetos grandes almacenados en uno o varios de los tipos de datos text, ntext, image, xml, varchar(max), nvarchar(max) o varbinary(max), o bien tipos definidos por el usuario CLR (CLR UDT). Las pginas son del tipo texto e imagen. Datos de longitud variable almacenados en varchar, nvarchar o varbinary, o bien columnas sql_variant que superan el lmite de ROW_OVERFLOW_DATA tamao de las filas de 8.060 bytes. Las pginas son del tipo datos.

LOB_DATA

Un montn o un rbol b slo puede tener una unidad de asignacin de cada tipo en una particin especfica. Para ver la informacin de unidades de asignacin de tablas o ndices, utilice la vista de catlogo sys.allocation_units. Unidad de asignacin IN_ROW_DATA Por cada particin utilizada por una tabla (montn o tabla agrupada), un ndice o una vista indizada, hay una unidad de asignacin IN_ROW_DATA formada por una coleccin de pginas de datos. Esta unidad de asignacin tambin incluye colecciones adicionales de pginas para implementar cada ndice XML y no agrupado definido para la tabla o la vista. Las colecciones de pginas de cada particin de una tabla, ndice o vista indizada estn delimitadas por punteros de pgina en la vista del sistema sys.system_internals_allocation_units. Importante: La vista del sistema sys.system_internals_allocation_units es nicamente para uso interno y est sujeta a cambios. No se garantiza la compatibilidad. Cada particin de una tabla, ndice o vista indizada tiene una fila en sys.system_internals_allocation_units identificada de forma nica mediante un Id. de contenedor (container_id). El Id. de contenedor tiene una asignacin uno a uno para partition_id en la vista de catlogo sys.partitions que mantiene la relacin entre los datos de

Ing. Rosa Navarrete

BASES DE DATOS II

20

la tabla, el ndice o la vista indizada de una particin y las unidades de asignacin utilizadas para administrar los datos en la particin. La asignacin de pginas a una particin de tabla, ndice o vista indizada se administra mediante una cadena de pginas IAM. La columna first_iam_page de sys.system_internals_allocation_units apunta a la primera pgina IAM de la cadena de pginas IAM que administran el espacio asignado a la tabla, el ndice o la vista indizada de la unidad de asignacin IN_ROW_DATA. sys.partitions devuelve una fila para cada particin de una tabla o un ndice. Un montn tiene una fila en sys.partitions con index_id = 0. La columna first_iam_page de sys.system_internals_allocation_units apunta a la cadena IAM de la coleccin de pginas de datos de montn de la particin especificada. El servidor utiliza las pginas IAM para buscar las pginas en la coleccin de pginas de datos, puesto que no estn vinculadas. 1. La columna root_page de sys.system_internals_allocation_units apunta a la parte superior del rbol b del ndice agrupado en la particin especificada. El servidor utiliza el rbol b del ndice para buscar las pginas de datos en la particin. Cada ndice no agrupado creado para una tabla o vista tiene una fila en sys.partitions con index_id > 1. La columna root_page de sys.system_internals_allocation_units apunta a la parte superior del rbol b del ndice no agrupado en la particin especificada. Cada tabla que tiene al menos una columna LOB tambin tiene una fila en sys.partitions con index_id > 250. La columna first_iam_page apunta a la cadena de pginas IAM que administra las pginas de la unidad de asignacin LOB_DATA. Unidad de asignacin ROW_OVERFLOW_DATA Por cada particin utilizada por una tabla (montn o tabla agrupada), un ndice o una vista indizada, hay una unidad de asignacin ROW_OVERFLOW_DATA. Esta unidad de asignacin no tiene ninguna pgina hasta que una fila de datos con columnas de longitud variable (varchar, nvarchar, varbinary o sql_variant) de la unidad de asignacin IN_ROW_DATA supera el lmite de tamao de fila de 8 KB. Cuando se alcanza este lmite, SQL Server mueve la columna ms ancha de esa fila a una pgina de la unidad de asignacin ROW_OVERFLOW_DATA. Se mantiene un puntero de 24 bytes a estos datos no consecutivos en la pgina original. Las pginas de texto o imagen de la unidad de asignacin ROW_OVERFLOW_DATA se administran del mismo modo que las de la unidad de asignacin LOB_DATA; es decir, mediante una cadena de pginas IAM. Unidad de asignacin LOB_DATA Cuando una tabla o un ndice tiene uno o varios tipos de datos LOB, se asignar una unidad de asignacin LOB_DATA por particin para administrar el almacenamiento de esos datos. Los tipos de datos LOB incluyen text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) y los tipos definidos por el usuario CLR. Un ndice agrupado de una tabla o vista tiene una fila en sys.partitions con index_id =

Ing. Rosa Navarrete

BASES DE DATOS II

21

Ejemplo de unidad de asignacin y particin En el ejemplo siguiente se devuelven los datos de unidad de asignacin y particin para dos tablas: DatabaseLog, un montn con datos LOB e ndices no agrupados, y Currency, una tabla agrupada sin datos LOB y un ndice no agrupado. Ambas tablas tienen una sola particin. USE AdventureWorks; GO SELECT o.name AS table_name,p.index_id, i.name AS index_name , au.type_desc AS allocation_type, au.data_pages, partition_number FROM sys.allocation_units AS au JOIN sys.partitions AS p ON au.container_id = p.partition_id JOIN sys.objects AS o ON p.object_id = o.object_id JOIN sys.indexes AS i ON p.index_id = i.index_id AND i.object_id = p.object_id WHERE o.name = N'DatabaseLog' OR o.name = N'Currency' ORDER BY o.name, p.index_id; El conjunto de resultados es el siguiente. Tenga en cuenta que la tabla DatabaseLog utiliza los tres tipos de unidad de asignacin, pues contiene tipos de pginas de datos y de texto e imagen. La tabla Currency no tiene datos LOB, pero tiene la unidad de asignacin necesaria para administrar las pginas de datos. Si ms adelante se modifica la tabla Currency para incluir una columna de tipo de datos LOB, se crear una unidad de asignacin LOB_DATA para administrar esos datos. table_name index_id index_name allocation_type data_pages partition_number ----------- -------- ----------------------- --------------- ----------- -----------Currency 1 PK_Currency_CurrencyCode IN_ROW_DATA 1 1 Currency 3 AK_Currency_Name IN_ROW_DATA 1 1 DatabaseLog 0 NULL IN_ROW_DATA 160 1 DatabaseLog 0 NULL ROW_OVERFLOW_DATA 0 1 DatabaseLog 0 NULL LOB_DATA 49 1 (5 row(s) affected)

ESTRUCTURAS DE MONTN Un montn es una tabla que no tiene un ndice agrupado. Los montones tienen una fila en sys.partitions, con index_id = 0 para cada particin que el montn utiliza. De forma predeterminada, un montn contiene una sola particin. Cuando un montn tiene varias particiones, cada particin incluye una estructure de montn que contiene los datos de esa particin especfica. Por ejemplo, si un montn tiene cuatro particiones, existirn cuatro estructuras de montn, una en cada particin. Dependiendo de los tipos de datos incluidos en el montn, cada estructura de montn tendr una o ms unidades de asignacin para almacenar y administrar los datos de una particin especfica. Como mnimo, cada montn dispondr de una unidad de asignacin IN_ROW_DATA por particin. El montn tambin dispondr de una unidad de asignacin LOB_DATA por particin si contiene columnas de objeto grande (LOB), as como una unidad de asignacin ROW_OVERFLOW_DATA por unidad, si contiene columnas de longitud variable que superan el lmite de tamao de fila de 8.060 bytes. La columna first_iam_page en la vista de sistema sys.system_internals_allocation_units seala la primera pgina IAM de la cadena de pginas IAM que administra el espacio asignado a la pila en una particin especfica. SQL Server 2005 utiliza las pginas IAM para desplazarse por el montn. Las pginas de datos y las filas que se encuentran en ellas no estn en ningn orden concreto y no estn vinculadas. La nica conexin lgica entre las pginas de datos es la informacin registrada en las pginas IAM.

Ing. Rosa Navarrete

BASES DE DATOS II

22

Importante: La vista de sistema sys.system_internals_allocation_units se ha diseado para uso interno y est sujeta a cambios, por lo que la compatibilidad no est garantizada. Los recorridos de tablas o las lecturas secuenciales de un montn se hacen recorriendo las pginas IAM para buscar las extensiones que almacenan las pginas de dicho montn. Como la IAM representa las extensiones en el mismo orden en el que se encuentran en los archivos de datos, ello significa que los recorridos secuenciales de un montn recorren secuencialmente cada archivo. Utilizar las pginas IAM para establecer la secuencia de recorrido tambin significa que las filas del montn no se devuelven normalmente en el orden en que se introdujeron. La siguiente ilustracin muestra cmo SQL Server Database Engine (Motor de base de datos de SQL Server) utiliza las pginas IAM para recuperar las filas de datos en un solo montn de particin.

ESTRUCTURAS DE NDICES AGRUPADOS

En SQL Server, los ndices se organizan como rboles b. Las pginas de un rbol b de ndice se llaman nodos del ndice. El nodo superior del rbol b se llama nodo raz. El nivel inferior de los nodos del ndice se denomina nodos de hoja. Los niveles del ndice entre el nodo raz y los nodos hoja se conocen en conjunto como niveles intermedios. En un ndice agrupado, los nodos hoja contienen las pginas de datos de la tabla subyacente. El nodo raz y los nodos hoja contienen pginas de ndice que contienen filas de ndice. Cada fila de ndice contiene un valor clave y un puntero a una pgina de nivel intermedio en el rbol b, o bien a una fila de datos del nivel hoja del ndice. Las pginas de cada nivel del ndice se vinculan en una lista con vnculos dobles. Los ndices agrupados tienen una fila en sys.partitions, con index_id = 1 para cada particin utilizada por el ndice. De forma predeterminada, un ndice agrupado tiene una sola particin. Cuando un ndice agrupado tiene mltiples particiones, cada particin tiene una estructura de rbol b que contiene los datos de esa particin especfica. Por ejemplo, si un ndice agrupado tiene cuatro particiones, hay cuatro estructuras de rbol b, una en cada particin. En funcin de los tipos de datos del ndice agrupado, cada estructura de ndice agrupado tendr una o ms unidades de asignacin en las que almacenar y administrar los datos de una

Ing. Rosa Navarrete

BASES DE DATOS II

23

particin especfica. Como mnimo, cada ndice agrupado tendr una unidad de asignacin IN_ROW_DATA por particin. El ndice agrupado tambin tendr una unidad de asignacin LOB_DATA por particin si contiene columnas de objetos grandes (LOB). Tambin tendr una unidad de asignacin ROW_OVERFLOW_DATA por particin si contiene columnas de longitud variable que superen el lmite de tamao de fila de 8.060 bytes. Las pginas de la cadena de datos y las filas que contienen se ordenan segn el valor de la clave de ndice agrupado. Todas las inserciones se hacen en el punto en el que el valor de clave de la fila insertada quede dentro de la secuencia de orden entre las filas existentes. Las colecciones de pginas del rbol b estn delimitadas por punteros de pgina en la vista del sistema sys.system_internals_allocation_units. Importante: La vista del sistema sys.system_internals_allocation_units es nicamente para uso interno y est sujeta a cambios. No se garantiza la compatibilidad. En un ndice agrupado, la columna root_page de sys.system_internals_allocation_units apunta al nivel superior del ndice agrupado para una particin especfica. SQL Server baja en el ndice para buscar la fila correspondiente a una clave de ndice agrupado. Para buscar un intervalo de claves, SQL Server se desplaza por el ndice hasta encontrar el valor de clave inicial del intervalo y despus recorre las pginas de datos mediante los punteros anterior y siguiente. Para buscar la primera pgina de la cadena de pginas de datos, SQL Server sigue los punteros situados ms a la izquierda desde el nodo raz del ndice. En esta ilustracin se muestra la estructura de un ndice agrupado en una sola particin.

Ing. Rosa Navarrete

BASES DE DATOS II

24

INDICES NO AGRUPADOS

Los ndices no agrupados tienen la misma estructura de rbol b que los ndices agrupados, excepto por las siguientes diferencias importantes: Las filas de datos de la tabla subyacente no estn ordenadas ni almacenadas basndose en sus claves no agrupadas. La capa de hoja de un ndice no agrupado est compuesta por pginas de ndices, en lugar de pginas de datos.

Los ndices no agrupados se pueden definir en una tabla o vista con un ndice agrupado o un montn. Cada fila del ndice no agrupado contiene un valor de clave no agrupada y un localizador de fila. Este localizador apunta a la fila de datos del ndice agrupado o el montn que contiene el valor de clave. Los localizadores de filas de las filas de ndices no agrupados pueden ser un puntero a la fila o una clave de ndice agrupado para una fila, tal como se describe a continuacin: Si la tabla es un montn, lo que significa que no tiene ningn ndice agrupado, el localizador de fila es un puntero a la fila. El puntero se genera a partir del identificador (Id.) de archivo, el nmero de pgina y el nmero de la fila dentro de la pgina. El puntero completo se conoce como Id. de fila (RID). Si la tabla tiene un ndice agrupado o si el ndice est en una vista indizada, el localizador de fila es la clave del ndice agrupado para la fila. Si el ndice agrupado no es un ndice nico, SQL Server 2005 hace que las claves duplicadas sean nicas agregando un valor generado internamente denominado valor de unicidad. Este valor de cuatro bytes no es visible para los usuarios. Slo se agrega cuando es necesario para que la clave agrupada sea nica para usarla en los ndices no agrupados. SQL Server recupera la fila de datos buscando el ndice agrupado con el valor de clave del ndice agrupado que est almacenado en la fila de hoja del ndice no agrupado.

Los ndices no agrupados tienen una fila en sys.partitions, con index_id >1 para cada particin utilizada por el ndice. De forma predeterminada, un ndice no agrupado tiene una sola particin. Cuando un ndice no agrupado tiene varias particiones, cada una tiene una estructura de rbol b que contiene las filas de ndice de esa particin especfica. Por ejemplo, si un ndice no agrupado tiene cuatro particiones, habr cuatro estructuras de rbol b, una en cada particin. En funcin de los tipos de datos del ndice no agrupado, cada estructura de ndice no agrupado tendr una o ms unidades de asignacin en las que almacenar y administrar los datos de una particin especfica. Como mnimo, cada ndice no agrupado tendr una unidad de asignacin IN_ROW_DATA por particin encargada de almacenar las pginas de rbol b del ndice. El ndice no agrupado tambin tendr una unidad de asignacin LOB_DATA por particin si contiene columnas de objetos grandes (LOB). Tambin tendr una unidad de asignacin ROW_OVERFLOW_DATA por particin si contiene columnas de longitud variable que superen el lmite de tamao de fila de 8.060 bytes. Las colecciones de pginas del rbol b estn delimitadas por punteros root_page en la vista del sistema sys.system_internals_allocation_units. Importante: La vista del sistema sys.system_internals_allocation_units es nicamente para uso interno y est sujeta a cambios. No se garantiza la compatibilidad. En la siguiente ilustracin se muestra la estructura de un ndice no agrupado en una sola particin.

Ing. Rosa Navarrete

BASES DE DATOS II

25

ndices de columna incluidos En SQL Server 2005, la funcionalidad de los ndices no agrupados puede ampliarse si se agregan columnas incluidas, denominadas columnas sin clave, en el nivel hoja del ndice. Las columnas de clave se almacenan en todos los niveles de ndice no agrupado, mientras que las columnas sin clave slo se almacenan en el nivel hoja

Ing. Rosa Navarrete