Cuando se especifica index_id, la instrucción DBCC SHOWCONTIG recorre la cadena de páginas en el nivel hoja del índice especificado. Si sólo se especifica table_id o si index_id es 0, se recorren las páginas de datos de la tabla especificada. Esta operación sólo requiere un bloqueo de tabla con intención compartida (IS). De este modo, se pueden realizar todas las actualizaciones e inserciones excepto las que requieren un bloqueo de tabla exclusivo (X). Esto permite un equilibrio entre la velocidad de ejecución y la no reducción de la simultaneidad con respecto al número de estadísticas devueltas. No obstante, si el comando se va a utilizar sólo para medir la fragmentación, se recomienda utilizar la opción WITH FAST para que el rendimiento sea óptimo. Un examen rápido no lee las páginas de nivel de datos u hoja del índice. La opción WITH FAST no se aplica a un montón.
El algoritmo para calcular la fragmentación es más preciso en SQL Server 2008 que en SQL Server 2000. En consecuencia, los valores de fragmentación aparecerán mayores. Por ejemplo, en SQL Server 2000, no se considera que una tabla está fragmentada si tiene las páginas 11 y 13 en la misma extensión y no la página 12. Sin embargo, el acceso a estas dos páginas requeriría dos operaciones de E/S físicas, por lo que en SQL Server 2008 esto se considera fragmentación.
Restricciones
DBCC SHOWCONTIG no muestra los datos con los tipos de datos ntext, text e image Esto se debe a que ya no existen los índices de texto (Id. de índice 255 en SQL Server 2000) que almacenan datos de texto e imagen. Para obtener más información acerca del Id. de índice 255, vea sys.sysindexes (Transact-SQL).
Además, DBCC SHOWCONTIG no admite algunas características nuevas. Por ejemplo:
-
Si la tabla o el índice especificados tienen particiones, DBCC SHOWCONTIG sólo muestra la primera partición de la tabla o el índice especificados.
-
DBCC SHOWCONTIG no muestra la información de almacenamiento de desbordamiento de fila y otros tipos de datos no consecutivos nuevos como nvarchar(max), varchar(max), varbinary(max) y xml.
-
DBCC SHOWCONTIG no admite los índices espaciales.
Todas las características nuevas son totalmente compatibles con la vista de administración dinámica sys.dm_db_index_physical_stats (Transact-SQL).
Fragmentación de tablas
DBCC SHOWCONTIG determina si la tabla está muy fragmentada. La fragmentación de las tablas es consecuencia de los procesos de modificación de los datos (instrucciones INSERT, UPDATE y DELETE) efectuados en las tablas. Como dichas modificaciones no suelen estar distribuidas de forma equilibrada entre todas las filas de la tabla, el llenado de cada página puede variar con el paso del tiempo. En las consultas que recorren la totalidad o parte de una tabla, esta fragmentación de tabla puede ocasionar lecturas de páginas adicionales. Esto afecta al recorrido paralelo de los datos.
Cuando un índice está muy fragmentado, existen dos opciones para reducir la fragmentación:
-
Quite y vuelva a crear un índice clúster.
La reconstrucción de un índice clúster reorganiza los datos y hace que las páginas de datos se llenen. El grado de llenado se puede configurar mediante la opción FILLFACTOR en CREATE INDEX. El inconveniente de este método es que el índice está sin conexión durante el proceso de eliminación y nueva creación, y que la operación es atómica. Si se interrumpe la creación del índice, éste no se vuelve a crear.
-
Reordene las páginas de nivel hoja del índice en un orden lógico.
Utilice ALTER INDEX…REORGANIZE para reordenar las páginas de nivel hoja del índice en un orden lógico. Dado que esta operación se realiza en línea, el índice está disponible mientras se ejecuta la instrucción. También es posible interrumpir la operación sin perder todo el trabajo. El inconveniente de este método es que no es una forma tan buena de reorganizar los datos como la operación de quitar y volver a crear el índice clúster.
-
Vuelve a generar el índice.
Para volver a generar el índice, utilice ALTER INDEX con REBUILD. Para obtener más información, vea ALTER INDEX (Transact-SQL).
Las estadísticas Avg. Bytes free per page y Avg. Page density (full) del conjunto de resultados indican el llenado de las páginas de índice. El número de Avg. Bytes free per page debería ser bajo y el de Avg. Page density (full) debería ser alto para un índice que no tenga muchas inserciones aleatorias. Quitar y volver a crear un índice con la opción FILLFACTOR especificada puede mejorar estas estadísticas. Además, ALTER INDEX con REORGANIZE compactará un índice, teniendo en cuenta FILLFACTOR, lo que mejorará las estadísticas.
Nota: |
|---|
|
En un índice que contenga muchas inserciones aleatorias y páginas muy llenas se produce un aumento de las divisiones de páginas. Esto aumenta a su vez la fragmentación.
|
El nivel de fragmentación de un índice puede determinarse de las siguientes formas:
-
Mediante la comparación de los valores de Extent Switches y Extents Scanned.
El valor de Extent Switches debe ser lo más parecido posible al de Extents Scanned. Esta relación se calcula como el valor de Scan Density. Dicho valor debe ser lo más alto posible y se puede aumentar mediante la reducción de la fragmentación del índice.
Nota: |
|---|
|
Este método no funciona si el índice abarca varios archivos.
|
-
Mediante la comprensión de los valores de Logical Scan Fragmentation y Extent Scan Fragmentation.
El valor de Logical Scan Fragmentation y, en menor medida, el valor de Extent Scan Fragmentation ofrecen la mejor indicación del nivel de fragmentación de una tabla. Ambos valores deberían tender a cero tanto como fuera posible, aunque puede ser aceptable un valor entre el 0 y el 10 por ciento.
Nota: |
|---|
|
El valor de Extent Scan Fragmentation es alto si el índice abarca varios archivos. Para reducir estos valores, debe reducir la fragmentación del índice.
|