sql >> Base de Datos >  >> RDS >> Sqlserver

¿Reducir la fragmentación de la tabla de SQL Server sin agregar/eliminar un índice agrupado?

Problema

Aclaremos un poco, porque este es un problema común, un problema serio para todas las empresas que usan SQL Server.

Este problema y la necesidad de CREAR ÍNDICE CLUSTERADO se malinterpretan.

Estuvo de acuerdo en que tener un índice agrupado permanente es mejor que no tenerlo. Pero ese no es el punto, y de todos modos conducirá a una larga discusión, así que dejemos eso a un lado y concentrémonos en la pregunta publicada.

El punto es que tienes una fragmentación sustancial en el Montón . Sigue llamándolo "tabla", pero no existe tal cosa en el almacenamiento de datos físicos o en el nivel de DataStructure. Una mesa es un concepto lógico, no físico. Es una colección de estructuras de datos físicas. La colección es una de dos posibilidades:

  • Montón
    más todos los índices no agrupados
    más cadenas de texto/imagen

  • o un índice agrupado
    (elimina el Montón y uno índice no agrupado)
    más todos los índices no agrupados
    más cadenas de texto/imagen.

Los montones se fragmentan gravemente; mientras más insertos/borrados/actualizaciones intercalados (aleatorios) haya, más fragmentación.

No hay forma de limpiar el Montón, tal como está. MS no proporciona una instalación (otros proveedores sí lo hacen).

Solución

Sin embargo, sabemos que Create Clustered Index reescribe y reordena el Heap por completo. El método (no es un truco), por lo tanto, es crear un índice agrupado solo con el fin de desfragmentar el montón y suéltelo después. Necesita espacio libre en la base de datos de table_size x 1.25.

Ya que estás en eso, por todos los medios, usa FILLFACTOR, para reducir el futuro fragmentación. El montón ocupará más espacio asignado, lo que permitirá futuras inserciones, eliminaciones y expansiones de filas debido a las actualizaciones.

Nota

  1. Tenga en cuenta que hay tres Niveles de Fragmentación; esto se ocupa solo del nivel III, la fragmentación dentro del montón, que es causada por falta de un índice agrupado

  2. Como una tarea separada, en algún otro momento, es posible que desee contemplar la implementación de un índice agrupado permanente, que elimina la fragmentación por completo... pero eso es independiente del problema publicado.

Respuesta al comentario

No exactamente. Yo no lo llamaría una "limitación".

  1. El método que he dado para eliminar la fragmentación en el montón es crear un índice agrupado, y luego soltarlo. Es decir. temporalmente, cuyo único fin es corregir la Fragmentación.

  2. Implementar un índice agrupado en la tabla (permanentemente) es una solución mucho mejor, porque reduce general Fragmentación (la estructura de datos aún puede fragmentarse, consulte la información detallada en los enlaces a continuación), que es mucho menor que la fragmentación que ocurre en un montón.

    • Cada tabla en una base de datos relacional (excepto las tablas de "tubería" o "cola") debe tener un índice agrupado para aprovechar sus diversos beneficios.

    • El índice agrupado debe estar en las columnas que distribuyen los datos (evitando conflictos de INSERCIÓN), nunca debe indexarse ​​en una columna que aumenta monótonamente, como ID de registro, lo que garantiza un punto de acceso de INSERCIÓN en la última página.

En MS SQL y Sybase ASE, hay tres Niveles de fragmentación, y dentro de cada nivel, varios tipos diferentes . Tenga en cuenta que cuando se trata de Fragmentación, debemos centrarnos en DataStructures, no en tablas (una tabla es una colección de DataStructures, como se explicó anteriormente). Los niveles son:

  • Nivel I • Estructura de datos extra
    Fuera de la Estructura de datos en cuestión, a través o dentro de la base de datos.

  • Nivel II • Estructura de datos
    Dentro de la estructura de datos en cuestión, arriba de las páginas (en todas las páginas)
    Este es el nivel que abordan con más frecuencia los administradores de bases de datos.

  • Nivel III • Página
    Dentro de la Estructura de Datos en cuestión, dentro de las Páginas

Estos enlaces proporcionan detalles completos sobre la fragmentación. Son específicos de Sybase ASE, sin embargo, a nivel estructural, la información se aplica a MS SQL.

Tenga en cuenta que el método que he dado es de Nivel II, corrige la Fragmentación de Nivel II y III.