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

Cómo recopilar proactivamente información de fragmentación de índices de SQL Server

Introducción a los índices de SQL Server

Microsoft SQL Server se considera uno de los sistemas de gestión de bases de datos relacionales (RDBMS ), en el que los datos se organizan lógicamente en filas y columnas que se almacenan en contenedores de datos denominados tablas. Físicamente, las tablas se almacenan como páginas de 8 KB que se pueden organizar en tablas agrupadas en Heap o B-Tree. En el montón tabla, no hay un orden de clasificación que controle el orden de los datos dentro de las páginas de datos y la secuencia de páginas dentro de esa tabla, ya que no hay un índice agrupado definido en esa tabla para aplicar el mecanismo de clasificación. Si se define un índice agrupado en una columna del grupo de columnas de la tabla, los datos se ordenarán dentro de las páginas de datos en función de los valores de las columnas clave del índice agrupado y las páginas se vincularán entre sí en función de estos valores clave de índice. Esta tabla ordenada se denomina tabla agrupada .

En SQL Server, el índice se considera una clave importante y eficaz en el proceso de ajuste del rendimiento. El propósito de crear un índice es acelerar el acceso a la tabla base y recuperar los datos solicitados sin tener que escanear todas las filas de la tabla para devolver los datos solicitados. Puede pensar en el índice de la base de datos como un índice de libro que lo ayuda a encontrar rápidamente las palabras en el libro, sin tener que leer todo el libro para encontrar esa palabra. Por ejemplo, suponga que necesita recuperar información sobre un cliente específico utilizando una ID de cliente. Si no hay un índice definido para la columna ID de cliente en esta tabla, el motor de SQL Server verifica todas las filas de la tabla, una por una, para recuperar el cliente con la ID proporcionada. Si se define un índice para la columna Id. de cliente en esta tabla, el motor de SQL Server buscará los valores de Id. de cliente solicitados en el índice ordenado, en lugar de en la tabla base, para recuperar información sobre el cliente, reduciendo el número de escaneos. filas para recuperar los datos.

En SQL Server, el índice está estructurado lógicamente como páginas de 8K, o nodos de índice, en forma de árbol B. La estructura B-Tree contiene tres niveles:un nivel raíz que incluye una página de índice en la parte superior del árbol B, un nivel de hoja que se encuentra en la parte inferior del árbol B y contiene páginas de datos y un nivel intermedio que incluye todos los nodos ubicados entre los niveles raíz y hoja, con valores clave de índice y punteros a las siguientes páginas. Esta forma de árbol B proporciona una forma rápida de navegar por las páginas de datos de izquierda a derecha y de arriba a abajo, según la clave de índice.

En SQL Server, hay dos tipos principales de índices, un índice agrupado en el que los datos reales se almacenan en las páginas de nivel de hoja del índice, con la capacidad de crear solo un índice agrupado para cada tabla, ya que los datos dentro de las páginas de datos y el orden de las páginas se ordenarán según el índice agrupado llave. Si define una restricción de clave principal en su tabla, se creará automáticamente un índice agrupado si no se definió previamente un índice agrupado para esa tabla. El segundo tipo de índices es un índice no agrupado que incluye una copia ordenada de las columnas clave del índice y un puntero al resto de las columnas en la tabla base o el índice agrupado, con la capacidad de crear hasta 999 índices no agrupados para cada tabla.

SQL Server nos proporciona otros tipos especiales de índices, como un índice único que se crea automáticamente cuando se define una restricción única para imponer la unicidad de valores de columna específicos, un índice compuesto en el que más de una columna clave participará en la clave índice, un Índice de cobertura en el que todas las columnas solicitadas por una consulta específica participarán en la clave del índice, un Índice filtrado es decir, un índice no agrupado optimizado con un predicado de filtro para indexar solo una pequeña parte de las filas de la tabla, un índice espacial que se crea en las columnas que almacenan datos espaciales, un índice XML que se crea en objetos binarios grandes (BLOB) XML en columnas de tipo de datos XML, un índice de almacén de columnas en el que los datos se organizan en formato de datos en columnas, un índice de texto completo creado por el motor de texto completo de SQL Server y un índice hash que se usa en las tablas optimizadas para memoria.

Como solía llamar al índice de SQL Server, esta es una arma de doble filo , donde SQL Server Query Optimizer puede beneficiarse del índice bien diseñado para mejorar el rendimiento de sus aplicaciones al acelerar el proceso de recuperación de datos. Por el contrario, un índice que está mal diseñado no será elegido por SQL Server Query Optimizer y degradará el rendimiento de sus aplicaciones al ralentizar las operaciones de modificación de datos y consumirá su almacenamiento sin aprovecharlo en los datos. procesos de recuperación. Por lo tanto, es mejor seguir primero las mejores prácticas y pautas de creación de índices, verificar el efecto si se crea en el entorno de desarrollo y encontrar un compromiso entre la velocidad de las operaciones de recuperación de datos y la sobrecarga de agregar ese índice en las operaciones de modificación de datos. y los requisitos de espacio de ese índice, antes de aplicarlo al entorno de producción.

Antes de crear un índice, debe estudiar los diferentes aspectos que afectan la creación y el uso del índice. Esto incluye el tipo de la carga de trabajo de la base de datos, procesamiento de transacciones en línea (OLTP) o procesamiento analítico en línea (OLAP), el tamaño de la tabla , las características de las columnas de la tabla , el orden de clasificación de las columnas en la consulta, el tipo del índice que corresponde a la consulta y las propiedades de almacenamiento como el FILFACTOR y PAD_INDEX opciones que controlan el porcentaje de espacio en cada nivel de hoja y las páginas de nivel intermedio para llenar con datos.

Fragmentación del índice de SQL Server

Su trabajo como DBA no se limita a crear el índice correcto. Una vez que se crea el índice, debe monitorear el uso del índice y las estadísticas, por ejemplo, necesita saber si este índice se usa mal o no se usa en absoluto. Por lo tanto, puede proporcionar la solución correcta para mantener estos índices o reemplazarlos por otros más eficientes. De esta forma, mantendrá el máximo rendimiento aplicable para su sistema. Puede preguntarse:¿Por qué SQL Server Query Optimizer ya no usa mi índice, aunque antes lo hacía?

La respuesta se relaciona principalmente con los cambios continuos de datos y esquemas que se realizan en la tabla base que deben reflejarse en los índices. Con el tiempo, y con todos estos cambios, las páginas de índice se desordenan, lo que provoca que el índice se fragmente. Otro motivo de la fragmentación es un intento de insertar un nuevo valor o actualizar el valor actual, y el nuevo valor no cabe en el espacio libre disponible actualmente. En este caso, la página se dividirá en dos páginas, donde la nueva página se creará físicamente después de la última página. Y puede imaginar la lectura de un índice fragmentado y la cantidad de páginas que deben escanearse y, por supuesto, la cantidad de operaciones de E/S realizadas para recuperar varios registros debido a la distancia entre estas páginas. Y debido a este costo adicional de usar este índice fragmentado, el Optimizador de consultas de SQL Server ignorará este índice.

Distintas formas de fragmentar el índice

SQL Server nos proporciona diferentes formas de obtener el porcentaje de fragmentación del índice. La primera forma es verificar el porcentaje de fragmentación del índice en el Índice Propiedades ventana, debajo de Fragmentación pestaña, como se muestra a continuación:

Pero para verificar el nivel de fragmentación de múltiples índices, primero debe realizar la verificación del método de IU para todos los índices, uno por uno, lo cual es una operación que hace perder el tiempo. El segundo método disponible para verificar el nivel de fragmentación de todos los índices de la base de datos es consultar el DMF sys.dm_db_index_physical_stats y unirlo con el DMV sys.indexes para recuperar toda la información sobre estos índices, teniendo en cuenta que estas estadísticas se actualizarán cuando el El servicio de SQL Server se reinicia con una consulta similar a la siguiente:

SELECT  Indx.name AS Index_Name,
OBJECT_NAME(Indx.OBJECT_ID) AS Source_Table_Name,
Index_Stat.index_type_desc AS TypeOfIndex,
Index_Stat.avg_fragmentation_in_percent  Index_Fragmentation_Percentage
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) Index_Stat
INNER JOIN sys.indexes Indx  ON Indx.object_id = Index_Stat.object_id
AND Indx.index_id = Index_Stat.index_id
ORDER BY Index_Fragmentation_Percentage DESC

El resultado de salida de la consulta de AdventureWorks2016CTP3 la base de datos de prueba será similar a la siguiente:

El tercer método para obtener el porcentaje de fragmentación es utilizar el informe estándar integrado de SQL Server llamado Índice de estadísticas físicas. Este informe devuelve información útil sobre las particiones de índice, el porcentaje de fragmentación, la cantidad de páginas en cada partición de índice y recomendaciones sobre cómo solucionar el problema de fragmentación de índice mediante la reconstrucción o reorganización del índice. Para ver el informe, haga clic con el botón derecho en su base de datos, seleccione la opción Informes, Informes estándar y seleccione Índice de estadísticas físicas como se muestra a continuación:

En nuestro caso, el informe generado se verá así:

La última y más sencilla forma de recuperar el porcentaje de fragmentación de todos los índices de la base de datos es la herramienta dbForge Index Manager. El administrador de índices de dbForge La herramienta es un complemento que se puede agregar a su SQL Server Management Studio para analizar los índices de las bases de datos de SQL Server, brindándole un informe muy útil con el estado de los índices de la base de datos seleccionados y sugerencias de mantenimiento para solucionar estos problemas de fragmentación de índices.

Después de instalar el complemento dbForge Index Manager en su SSMS, puede ejecutarlo haciendo clic con el botón derecho en la base de datos que desea escanear, seleccione Index Manager y, a continuación, Administrar fragmentación de índice como se muestra a continuación:

La herramienta dbForge Index Manager le permite obtener una imagen general de la fragmentación de los índices de la base de datos seleccionados, con recomendaciones sobre las acciones adecuadas para solucionar este problema, como se muestra a continuación:

La herramienta dbForge Index Manager también le permite cambiar entre bases de datos, brindándole un nuevo informe después de escanear esta base de datos como se muestra a continuación:

El informe de fragmentación de índices generado por la herramienta dbForge Index Manager se puede exportar a un archivo CSV para analizar el estado de fragmentación de los índices, como se muestra a continuación:

dbForge Index Manager le permite generar scripts T-SQL para reconstruir o reorganizar los índices según la recomendación de la herramienta. Utilice los Cambios de secuencia de comandos opción para mostrar o guardar el script para los índices que están fragmentados, como se muestra a continuación:

La herramienta dbForge Index Manager le brinda la posibilidad de solucionar el problema de fragmentación del índice directamente haciendo clic en Reparar. botón que realizará la acción recomendada directamente en los índices seleccionados, mostrando el estado de corrección en el Resultado columna como se muestra a continuación:

Si hace clic en Volver a analizar botón, escaneará la fragmentación del índice en la base de datos nuevamente después de realizar la operación de reparación con éxito. Lo que se enumera aquí en este artículo es solo una introducción a cómo la herramienta dbForge Index Manager nos ayudará a identificar y solucionar problemas de fragmentación de índices. Mi recomendación para ti es que la descargues y compruebes lo que esta herramienta puede ofrecerte.

Enlaces útiles:

  • Conceptos básicos del índice
  • Tipos de índices
  • Se describen los índices agrupados y no agrupados
  • Estructuras de índices agrupados

Herramienta útil:

dbForge Index Manager:práctico complemento de SSMS para analizar el estado de los índices SQL y solucionar problemas con la fragmentación de índices.