Sunteți pe pagina 1din 25

BASES DE DATOS II

SQL Server 2005


INDICES
Un 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 AGRUPADOS
Los 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

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 <=. Cuando la fila se encuentra con el primer valor mediante el ndice agrupado, se garantiza que las filas con los valores indizados posteriores son fsicamente adyacentes. Por ejemplo, si una consulta recupera registros entre un intervalo de nmeros de pedidos de ventas, un ndice agrupado en la columna SalesOrderNumber puede localizar rpidamente la fila que contiene el nmero de pedido de ventas inicial y, a continuacin, recuperar todas las filas siguientes de la tabla hasta alcanzar el ltimo nmero de pedido de ventas. Devuelven grandes conjuntos de resultados. Utilizan clusulas JOIN; por lo general, son columnas de clave externa. Utilizan clusulas ORDER BY o GROUP BY. Un ndice en las columnas especificadas en la clusula ORDER BY o GROUP BY puede eliminar la necesidad de que Database Engine (Motor de base de datos) ordene los datos, puesto que las filas ya estn ordenadas. De ese modo, el rendimiento de las consultas aumenta. Consideraciones sobre las columnas Por regla genera, debe definir la clave de ndice agrupado con el menor nmero de columnas posible. Considere columnas que cuentan con uno o varios de los siguientes atributos: Son nicas o contienen muchos valores distintos Por ejemplo, un Id. de empleado identifica de forma exclusiva a los empleados. Un ndice agrupado o una restriccin PRIMARY KEY en la columna EmployeeID mejorara el rendimiento de las consultas que buscan informacin del empleado basndose en el nmero de Id. del empleado. Tambin se podra crear un ndice agrupado en las

Ing. Rosa Navarrete

BASES DE DATOS II

columnas LastName, FirstName y MiddleName, ya que los registros de empleados se agrupan y se consultan con frecuencia de esta forma y la combinacin de estas columnas seguira proporcionando un alto grado de diferencia. Se tiene acceso a ellas de forma secuencial Por ejemplo, un Id. de producto identifica de forma exclusiva los productos de la tabla Production.Product en la base de datos AdventureWorks. Un ndice agrupado en ProductID mejorara las consultas donde se especifica una bsqueda secuencial, como WHERE ProductID BETWEEN 980 and 999. Esto se debe a que las filas se almacenan de forma ordenada en esta columna de clave. Se definen como IDENTITY, ya que la columna va a ser nica en la tabla. Se utilizan con frecuencia para ordenar los datos recuperados de una tabla. Puede resultar conveniente agrupar, es decir, ordenar fsicamente la tabla de dicha columna para evitar una operacin de ordenacin cada vez que se consulta la columna. Los ndices agrupados no son adecuados para los siguientes atributos: Columnas sometidas a cambios frecuentes Esto provoca que se mueva toda la fila, ya que Database Engine (Motor de base de datos) debe mantener los valores de los datos de la fila ordenados fsicamente. Esta consideracin es importante en sistemas de procesamiento de transacciones de gran volumen en los que los datos tienden a ser voltiles. Claves amplias Las claves amplias se componen de varias columnas o varias columnas de gran tamao. Los valores clave del ndice agrupado se utilizan en todos los ndices no agrupados como claves de bsqueda. Los ndices no agrupados definidos en la misma tabla sern bastante ms grandes, ya que sus entradas contienen la clave de agrupacin y las columnas de clave definidas para dicho ndice no agrupado. Opciones del ndice Cuando se crea un ndice agrupado, se pueden especificar varias opciones de ndice. Generalmente, los ndices agrupados son bastante grandes, por lo que debe prestarse especial atencin a las opciones siguientes: SORT_IN_TEMPDB DROP_EXISTING FILLFACTOR ONLINE

INDICES NO AGRUPADOS
Un ndice no agrupado contiene los valores de clave del ndice y localizadores de fila que apuntan a la ubicacin de almacenamiento de los datos de tabla.

Ing. Rosa Navarrete

BASES DE DATOS II

Puede crear varios ndices no agrupados en una tabla o vista indizada. Por lo general, se deben disear ndices no agrupados para mejorar el rendimiento de consultas utilizadas con frecuencia no cubiertas por el ndice agrupado. Al igual que cuando se utiliza un ndice de un libro, el optimizador de consultas busca valores de datos en el ndice no agrupado para encontrar la ubicacin del valor de datos en la tabla y, a continuacin, recupera los datos directamente de esa ubicacin. Este sistema convierte a los ndices no agrupados en la opcin ms apropiada para las consultas de coincidencia exacta, dado que el ndice contiene entradas que describen la ubicacin exacta en la tabla de los valores de datos que se buscan en las consultas. Por ejemplo, para consultar la tabla HumanResources.Employee para todos los subordinados de un jefe determinado, el optimizador de consultas podra utilizar el ndice no agrupado IX_Employee_ManagerID, que tiene ManagerID como columna de clave. El optimizador de consultas puede buscar rpidamente todas las entradas del ndice que coinciden con el ManagerID especificado. Cada entrada de ndice apunta a la pgina y fila exactas de la tabla, o ndice agrupado, en que se pueden encontrar los datos correspondientes. Una vez que el optimizador de consultas busca todas las entradas del ndice, puede ir directamente a la pgina y fila exactas para recuperar los datos. Consideraciones acerca de las bases de datos Tenga en cuenta las caractersticas de la base de datos al disear ndices no agrupados. Las bases de datos o tablas que exigen pocos requisitos para la actualizacin, pero suelen contener un gran volumen de datos, se pueden beneficiar de muchos ndices no agrupados para mejorar el optimizador de consultas. Las aplicaciones y bases de datos del sistema de ayuda para la toma de decisiones que contienen principalmente datos de slo lectura se pueden beneficiar de muchos ndices no agrupados. El optimizador de consultas tiene ms ndices entre los que elegir para determinar el mtodo de acceso ms rpido. Adems, las caractersticas que exigen pocos requisitos para la actualizacin de la base de datos se traducen en que el mantenimiento de los ndices no reducir el rendimiento. Las aplicaciones y bases de datos de procesamiento de transacciones en lnea (OLTP) que contienen tablas deben evitar el exceso de ndices. Adems, los ndices deben ser estrechos, es decir, con la menor cantidad de columnas posible. Si se utiliza un gran nmero de ndices en una tabla, el rendimiento de las instrucciones INSERT, UPDATE y DELETE se ver afectado, ya que todos los ndices deben ajustarse adecuadamente a medida que cambian los datos de la tabla. Consideraciones sobre consultas Antes de crear ndices no agrupados, debe conocer cmo se tiene acceso a los datos. Considere la posibilidad de utilizar un ndice no agrupado para consultas que cuentan con los siguientes atributos: Utilizan clusulas JOIN o GROUP BY. Crean varios ndices no agrupados para las columnas que intervienen en operaciones de combinacin y de agrupacin, y un ndice agrupado para las columnas de clave externa. No devuelven conjuntos de resultados de gran tamao. Contienen columnas que suelen incluirse en las condiciones de bsqueda de una consulta, como la clusula WHERE, que devuelven coincidencias exactas.

Ing. Rosa Navarrete

BASES DE DATOS II

Consideraciones sobre columnas Tenga en cuenta las columnas que tengan uno o varios de estos atributos: Cubren la consulta. Se obtienen mejoras de rendimiento cuando el ndice contiene todas las columnas de la consulta. El optimizador de consultas puede buscar todos los valores de columna del ndice; no se tiene acceso a los datos de tabla o de ndice agrupado, lo que se traduce en menos operaciones de E/S de disco. Utilice un ndice con columnas incluidas para agregar columnas de cobertura en lugar de crear una clave de ndice ancho.

Si la tabla tiene un ndice agrupado, las columnas definidas en l se anexan automticamente al final de cada ndice no agrupado de la tabla. Esto puede producir una consulta cubierta sin especificar las columnas de ndice agrupado en la definicin del ndice no agrupado. Por ejemplo, si una tabla tiene un ndice agrupado en la columna C y un ndice no agrupado en las columnas B y A, tendr como valores de clave las columnas B, A y C. Gran nmero de valores distintos, como combinaciones de nombres y apellidos, si se utiliza un ndice agrupado para otras columnas. Si hay muy pocos valores distintos, como slo 1 y 0, la mayora de las consultas no utilizarn el ndice, ya que una exploracin de la tabla suele ser ms eficaz. Opciones de ndice Existen varias opciones de ndice que se pueden especificar al crear un ndice no agrupado. Debe prestar especial consideracin a las siguientes opciones: FILLFACTOR ONLINE

INDICES NICOS
Un ndice nico garantiza que la clave de ndice no contiene valores duplicados y, por tanto, cada fila de la tabla es en cierta forma nica. Resulta conveniente especificar un ndice nico slo si los propios datos se caracterizan por ser nicos. Por ejemplo, para asegurarse de que los valores de la columna NationalIDNumber de la tabla HumanResources.Employee sean nicos, cuando la clave principal es EmployeeID, cree una restriccin UNIQUE en la columna NationalIDNumber . Si el usuario intenta especificar el mismo valor en esa columna para ms de un empleado, se mostrar un mensaje de error que impedir la entrada del valor duplicado. En el caso de ndices nicos para varias columnas, el ndice asegura que cada combinacin de valores de la clave de ndice sea nica. Por ejemplo, si se crea un ndice nico en una combinacin de columnas LastName, FirstName y MiddleName, dos filas de la tabla no podrn tener la misma combinacin de valores para estas columnas. Tanto los ndices agrupados como los no agrupados pueden ser nicos. Siempre que los datos de la columna sean nicos, puede crear para la misma tabla un ndice agrupado nico y varios ndices agrupados no nicos. Entre las ventajas de utilizar ndices nicos se incluyen: Se garantiza la integridad de los datos de las columnas definidas.

Ing. Rosa Navarrete

BASES DE DATOS II

Se proporciona informacin adicional til para el optimizador de consultas.

Si se crea una restriccin PRIMARY KEY o UNIQUE, se crear automticamente un ndice nico en las columnas especificadas. No existen diferencias significativas entre la creacin de una restriccin UNIQUE y la creacin de un ndice nico independiente de una restriccin. La validacin de los datos tiene lugar de la misma manera y el optimizador de consultas no establece diferencias entre un ndice nico creado por una restriccin y uno creado manualmente. Sin embargo, deber crear una restriccin UNIQUE o PRIMARY KEY en la columna cuando el objetivo sea la integridad de los datos. Al hacer esto, el objetivo del ndice quedar claro. Consideraciones Un ndice nico, una restriccin UNIQUE o una restriccin PRIMARY KEY no se pueden crear si existen valores de clave duplicados en los datos. Si los datos son nicos y desea hacer cumplir la exclusividad, la creacin de un ndice nico en lugar de un ndice no nico en la misma combinacin de columnas proporciona informacin adicional para el optimizador de consultas que puede dar como resultado unos planes de ejecucin ms eficaces. En este caso se recomienda crear un ndice nico (preferiblemente mediante una restriccin UNIQUE). Un ndice no agrupado nico puede incluir columnas sin clave.

Opciones del ndice Al crear un ndice nico pueden utilizarse varias opciones de ndice. Tenga muy en cuenta las siguientes opciones: IGNORE_DUP_KEY ONLINE

Tareas de creacin de ndices


Las siguientes tareas forman parte de la estrategia recomendada para crear ndices: 1. Disear el ndice. El diseo de ndices es una tarea crtica. El diseo de ndices incluye la determinacin de las columnas que se utilizarn, la seleccin del tipo de ndice (por ejemplo, agrupado o no agrupado), la seleccin de opciones de ndice adecuadas y la determinacin de grupos de archivos o de la ubicacin de esquemas de particin. 2. Determinar el mejor mtodo de creacin. Los ndices se crean de las siguientes maneras: Definiendo una restriccin PRIMARY KEY o UNIQUE en una columna mediante CREATE TABLE o ALTER TABLE SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) crea automticamente un ndice exclusivo para hacer cumplir la unicidad de los requisitos de una restriccin PRIMARY KEY o UNIQUE. De forma predeterminada se crea un ndice agrupado nico para hacer cumplir una restriccin PRIMARY KEY, a menos que ya exista un ndice agrupado en la tabla o que usted especifique un ndice no agrupado nico. De forma predeterminada se crea un

Ing. Rosa Navarrete

BASES DE DATOS II

ndice nico no agrupado para hacer cumplir una restriccin UNIQUE a menos que se especifique de explcitamente un ndice agrupado nico y no exista un ndice agrupado en la tabla. Tambin se pueden especificar las opciones de ndice, la ubicacin del ndice, el grupo de archivos o el esquema de la particin. Un ndice creado como parte de una restriccin PRIMARY KEY o UNIQUE recibe automticamente el mismo nombre que la restriccin. Creando un ndice independiente de una restriccin utilizando la instruccin CREATE INDEX , o el cuadro de dilogo Nuevo ndice en el Explorador de objetos de SQL Server Management Studio Debe especificar el nombre del ndice, de la tabla y de las columnas a las que se aplica el ndice. Tambin se pueden especificar las opciones de ndice, la ubicacin del ndice, el grupo de archivos o el esquema de la particin. De forma predeterminada, se crea un ndice que no es nico y no est agrupado si no se especifican las opciones nicas o agrupadas. 3. Crear el ndice. Un factor importante que debe tenerse en cuenta es si el ndice se crear en una tabla vaca o en una tabla con datos. La creacin de un ndice en una tabla vaca no tiene implicaciones de rendimiento en el momento de creacin del ndice; sin embargo, el rendimiento se ver afectado cuando se agreguen los datos a la tabla. La creacin 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 tamao es empezar con el ndice agrupado y, a continuacin, generar los ndices no agrupados. Considere la posibilidad de establecer la opcin ONLINE en ON cuando cree ndices en tablas existentes. Cuando se establece en ON, los bloqueos a largo plazo no se retienen, lo que permite que continen consultas o actualizaciones a la tabla subyacente. Consideraciones de implementacin En la siguiente tabla se enumeran los valores mximos que se aplican a ndices agrupados, no agrupados y XML. A menos que se especifique lo contrario, las limitaciones se aplican a todos los tipos de ndices. Lmites de ndice mximos ndices agrupados por tabla ndices no agrupados por tabla ndices XML por tabla Nmero de columnas de clave por ndice Valor 1 249 Incluye ndices no agrupados creados por restricciones PRIMARY KEY o UNIQUE, pero no ndices XML. Incluye ndices XML principales y secundarios en columnas de tipos de datos XML. El ndice agrupado est limitado a 15 columnas si la tabla tambin contiene un ndice XML principal. Informacin adicional

249

16*

Tamao mximo del registro 900 No pertenece a ndices XML.. de clave de ndice bytes*

Ing. Rosa Navarrete

BASES DE DATOS II

*Puede evitar limitaciones de tamao de registro y de columna de clave de ndice de ndices no agrupados incluyendo columnas sin clave en el ndice. Tipos de datos Generalmente, se puede indizar cualquier columna de una tabla o de una vista. En la siguiente tabla se muestran todos los tipos de datos que tienen una participacin de ndice restringida. Tipo de datos Tipo definido por el usuario CLR Participacin de ndice Se puede indizar si el tipo admite el orden binario.

No pueden ser una columna de clave de ndice. No obstante, una columna xml puede ser una columna de clave en una tabla o en un Tipos de datos de objetos grandes (LOB): ndice XML secundario o principal. image, ntext, text, varchar(max), Pueden participar como columnas sin clave (incluidas) en un ndice no nvarchar(max), agrupado, excepto image, ntext y text. varbinary(max) y xml Pueden participar si son parte de una expresin de columna calculada. No se pueden indizar. Esto incluye columnas calculadas definidas como invocaciones de mtodos de una columna del tipo definido por un usuario CLR, mientras los mtodos se marquen como deterministas. Columnas calculadas Las columnas calculadas que se derivan de tipos de datos LOB se pueden indizar como columna con clave o sin clave mientras el tipo de datos de columna calculada se permita como columna de clave de ndice o columna sin clave. La clave de ndice de un ndice agrupado no puede contener columnas varchar con datos existentes en la unidad de asignacin Columnas de Varchar ROW_OVERFLOW_DATA. Si un ndice agrupado se crea en una de insercin no columna varchar y los datos existentes estn en la unidad de consecutiva asignacin IN_ROW_DATA, las acciones de insercin o actualizacin posteriores de la columna que constituiran inserciones no consecutivas producirn un error.

Consideraciones adicionales A continuacin se ofrecen algunas consideraciones adicionales para crear un ndice: Puede crear un ndice si tiene el permiso CONTROL o ALTER en la tabla. Cuando se crea, el ndice se habilita automticamente y est disponible para su uso. Puede quitar el acceso a un ndice deshabilitndolo.

Requisitos de espacio en disco El espacio en disco necesario para almacenar el ndice depende de los siguientes factores: El tamao de cada fila de datos de la tabla y el nmero de filas por pgina. As se determina el nmero de pginas de datos que se deben leer del disco para crear el ndice.

Ing. Rosa Navarrete

BASES DE DATOS II

Las columnas del ndice y los tipos de datos utilizados. As se determina el nmero de pginas de ndice que se deben escribir en disco. Espacio temporal en disco necesario durante el proceso de creacin del ndice.

Consideraciones de rendimiento El tiempo que ocupa la creacin fsica de un ndice depende en gran medida del subsistema de disco. Los factores importantes que se deben tener en cuenta son: El modelo de recuperacin de la base de datos. El modelo de recuperacin de registro masivo proporciona un rendimiento mucho mayor y un consumo de espacio de registro ms reducido que la recuperacin completa durante la operacin de creacin del ndice. Sin embargo, la recuperacin por medio de registros de operaciones masivas reduce la flexibilidad para la recuperacin de un momento dado. RAID (matriz redundante de discos econmicos) utilizada para almacenar los archivos de base de datos y del registro de transacciones. Normalmente, los niveles de RAID que utilizan la creacin de bandas tienen un ancho de banda de E/S mejor. Nmero de discos de la matriz de discos, si se utiliza RAID. Ms unidades en la matriz aumentan las tasas de transferencia de datos proporcionalmente. Dnde se almacenan las ordenaciones intermedias de los datos. Si utiliza la opcin SORT_IN_TEMPDB puede reducir el tiempo necesario para crear un ndice cuando tempdb se encuentra en un conjunto de discos diferente que la base de datos del usuario..

Creacin del ndice con o sin conexin. Cuando se crea un ndice sin conexin (valor predeterminado), los bloqueos exclusivos se mantienen en la tabla subyacente hasta que la transaccin que crea el ndice se ha completado. La tabla no est accesible para los usuarios mientras se crea el ndice. En SQL Server 2005, puede especificar que se cree el ndice con conexin. Cuando la opcin con conexin est establecida en ON, los bloqueos de la tabla a largo plazo no se conservan, lo que permite que las consultas o actualizaciones a la tabla subyacente continen mientras se crea el ndice. Aunque recomendamos operaciones de ndice con conexin, se debe evaluar el entorno y los requisitos especficos. Puede ser mejor ejecutar operaciones de ndice sin conexin. Al hacerlo as, los usuarios tienen acceso restringido a los datos durante la operacin, pero la operacin acaba con mayor rapidez y utiliza menos recursos.

Deshabilitar ndices
Al deshabilitar un ndice, se impide que el usuario pueda tener acceso al mismo y, en el caso de los ndices agrupados, a los datos de la tabla subyacente. La definicin del ndice se conserva en los metadatos, y las estadsticas de ndice se mantienen en ndices no agrupados. Al deshabilitar un ndice no agrupado o agrupado en una vista, se eliminan fsicamente los datos del ndice. Deshabilitar un ndice agrupado en una tabla, impide el acceso a los datos, que siguen en la tabla pero dejan de estar disponibles para operaciones DML hasta que se quite o vuelva a generar el ndice. Utilice las instrucciones ALTER INDEX REBUILD o CREATE INDEX WITH DROP_EXISTING para volver a generar y habilitar un ndice deshabilitado. En las siguientes circunstancias, pueden deshabilitarse uno o ms ndices: El SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) deshabilita automticamente el ndice durante una actualizacin de SQL Server. Al deshabilitar manualmente el ndice mediante ALTER INDEX.

Ing. Rosa Navarrete

BASES DE DATOS II

10

La actualizacin de SQL Server deshabilita un ndice Durante la actualizacin a una nueva versin o Service Pack de SQL Server, el Database Engine (Motor de base de datos) identifica y deshabilita de forma automtica los ndices, incluidos los ndices en vistas, siempre que el ndice o la definicin de la vista contengan uno de los siguientes elementos: Una expresin para la cual el Database Engine (Motor de base de datos) ya no pueda garantizar la integridad de los datos del ndice. Sera el caso, por ejemplo, de un ndice que utiliza una funcin del sistema que se hubiera cambiado durante la actualizacin de modo que devolviera un resultado distinto. El Database Engine (Motor de base de datos) deshabilitar el ndice durante la actualizacin, puesto que puede contener datos que dejarn de ser vlidos despus de la actualizacin. Una intercalacin que se haya modificado como parte de una actualizacin de forma que el ndice haya dejado de estar ordenado correctamente.

Cuando se deshabilita un ndice durante el proceso de actualizacin, un mensaje de advertencia muestra el nombre del ndice y los nombres de las restricciones asociadas para que el usuario pueda volver a generarlos una vez terminada la actualizacin. Al volver a generar el ndice y habilitar las restricciones, se corrigen los datos invalidados durante la actualizacin. Es posible que se deshabiliten una restriccin CHECK si la definicin contiene una expresin para la que el Database Engine (Motor de base de datos) ya no pueda garantizar la integridad de los datos. Para habilitar la restriccin, utilice la instruccin ALTER TABLE CHECK. Usar ALTER INDEX para deshabilitar un ndice Los ndices se pueden deshabilitar manualmente en cualquier momento mediante la instruccin ALTER INDEX DISABLE. Nota: Si una tabla se encuentra en una publicacin de rplica transaccional, no puede deshabilitar ningn ndice que est asociado con las columnas de clave principal. Estos ndices son necesarios para la rplica. Para deshabilitar un ndice, primero debe quitar la tabla de la publicacin. Quizs desee deshabilitar un ndice para llevar a cabo lo siguiente: Corregir un error de E/S de disco (error 823 o 824) de una pgina de ndice y luego volver a generar el ndice. Eliminar temporalmente el ndice para solucionar problemas. Volver a generar ndices no agrupados. Al deshabilitar un ndice no agrupado, la operacin para volver a generarlo requiere suficiente espacio en disco temporal para almacenar tanto el ndice antiguo como el nuevo. Sin embargo, el hecho de deshabilitar y volver a generar el ndice no agrupado en transacciones independientes, permite que el espacio en disco que queda disponible al deshabilitar el ndice pueda volver a usarse para la siguiente operacin de volver a generarlo o para cualquier otra operacin. No se necesita espacio adicional, salvo el espacio en disco temporal para la ordenacin, que suele ser un 20 por ciento del tamao del ndice. Si el espacio en disco es limitado, puede resultar til deshabilitar el ndice no agrupado

Ing. Rosa Navarrete

BASES DE DATOS II

11

antes de volver a generarlo. Sera el caso, por ejemplo, de un procedimiento almacenado que volviera a generar todos los ndices no agrupados en una o varias tablas. El hecho de deshabilitar los ndices en primer lugar en una transaccin independiente de la operacin de regeneracin, permite reducir de forma considerable el espacio en disco temporal necesario para su regeneracin.

Reorganizar ndices
SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) mantiene ndices automticamente cada vez que inserta, actualiza o elimina operaciones realizadas en los datos subyacentes. Con el tiempo, estas modificaciones pueden hacer que la informacin del ndice se disperse por la base de datos (se fragmente). La fragmentacin ocurre cuando los ndices tienen pginas en las que la ordenacin lgica, basada en el valor de clave, no coincide con la ordenacin fsica dentro del archivo de datos. Los ndices muy fragmentados pueden reducir el rendimiento de la consulta y ralentizar la respuesta de la aplicacin. En SQL Server 2005, puede solucionar la fragmentacin del ndice reorganizndolo o volvindolo a generar. Para los ndices con particiones generados en un esquema de particin, puede utilizar cualquiera de estos mtodos en un ndice completo o en una sola particin de un ndice cualquiera. Detectar la fragmentacin El primer paso necesario para detectar qu mtodo de desfragmentacin utilizar es analizar el ndice a fin de determinar la magnitud de la fragmentacin. Si utiliza la funcin del sistema sys.dm_db_index_physical_stats, podr detectar la fragmentacin de un ndice en particular, de todos los ndices de una tabla o vista indizada, de todos los ndices de una base de datos o de todos los ndices de todas las bases de datos. Por ejemplo, el porcentaje de fragmentacin lgica (pginas de un ndice que no funcionan correctamente) se muestra en la columna avg_fragmentation_in_percent. Para los ndices con particiones, sys.dm_db_index_physical_stats tambin proporciona informacin de la fragmentacin para cada particin. El conjunto de resultados devuelto por esta funcin contiene las siguientes columnas. Descripcin Porcentaje de fragmentacin lgica (pginas de un ndice que avg_fragmentation_in_percent no funcionan correctamente). fragment_count Nmero de fragmentos (pginas hoja fsicamente consecutivas) en el ndice. Columna

avg_fragment_size_in_pages Nmero promedio de pginas en un fragmento del ndice.

Una vez determinada la magnitud de la fragmentacin, utilice la siguiente tabla para determinar el mejor mtodo para corregir la fragmentacin propiamente dicha. Valor de avg_fragmentation_in_percent Instruccin correctiva < = 30% ALTER INDEX REORGANIZE > 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.

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.

No

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.

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

S-ar putea să vă placă și