¿Cuáles son algunos consejos para reconstruir índices en SQL?

Una de las mayores ideas erróneas sobre SQL Server es que es una plataforma de base de datos configurada y olvidada. Al igual que las otras plataformas de bases de datos en el espacio empresarial, Microsoft SQL Server necesita un poco de TLC de vez en cuando para que siga funcionando al máximo rendimiento.

Una de las cosas más importantes que puede hacer para mantener Microsoft SQL Server funcionando al máximo es reconstruir o desfragmentar sus índices. Observe que la palabra “o” está ahí, no la palabra “y”. Esto se debe a que la reconstrucción y desfragmentación (o desfragmentación) de sus índices produce el mismo resultado final. La diferencia es la ruta que toma, es decir, las operaciones que realiza SQL Server para llegar al resultado final.

Ni las operaciones de reconstrucción o desfragmentación son específicamente más rápidas que las otras. La regla básica para trabajar es que si es más rápido desfragmentar un índice que reconstruirlo, desfragmentarlo; mientras que si es más rápido reconstruir un índice que desfragmentarlo, debe reconstruirlo. En términos generales, si un índice está menos del 30 por ciento fragmentado, tendrá mejor suerte al desfragmentar el índice. Si el índice está más del 30 por ciento fragmentado, tendrá mejor suerte para reconstruirlo.

Lo que realmente están haciendo estas operaciones

Cuando creas un índice, configuras un parámetro en el índice que es clave para la rapidez con que tu índice se fragmentará. Esta configuración es el porcentaje del factor de relleno. Esta configuración le dice al SQL Server que cuando se asigna una nueva página al índice, qué porcentaje de espacio dentro de esa página debe asignarse para las nuevas páginas de datos. Esta configuración del factor de relleno también se usa cuando el índice se desfragmenta o se reconstruye.

Cuando reconstruye sus índices, básicamente lo que sucede es que el índice se elimina de la base de datos, y se crea un nuevo índice con el mismo nombre con la misma configuración.

Cuando desfragmenta sus índices, SQL Server comienza al principio del índice y comienza a poner todas las filas en el orden correcto, moviendo filas de una página de datos a otra y liberando espacio para que las páginas de datos tengan la cantidad correcta de espacio libre en ellos como se define por el factor de relleno.

¿Cuándo debo hacer uno sobre el otro?

Como se indicó anteriormente, un factor importante es la cantidad de tiempo que tomará completar cada operación (usualmente utilizando la cantidad de fragmentación como guía). Sin embargo, hay algunos otros factores a considerar. Si está utilizando alguna edición de SQL Server 2000 o anterior, o alguna edición de SQL Server 2005 y superior que no sea Enterprise Edition, las reconstrucciones de índice son una operación fuera de línea.

Lo que esto significa es que ningún usuario podrá acceder a los datos dentro de la tabla mientras se realiza la reconstrucción del índice. En SQL Server 2005, los usuarios de Enterprise Edition tuvieron la capacidad de realizar reconstrucciones de índices en línea. Esta capacidad le permite reconstruir índices sin tener que desconectar el índice y sin bloquear la tabla mientras se está reconstruyendo el índice.

Por otro lado, los índices de desfragmentación son operaciones en línea. Esto significa que mientras ocurre el proceso de desfragmentación del índice, sus usuarios podrán acceder a los datos.

Debido a esta diferencia clave, puede optar por realizar la desfragmentación de índices aunque sus índices estén muy fragmentados, especialmente si no puede permitirse el tiempo de inactividad para reconstruir sus índices.

Si está utilizando SQL Server 2005/2008 Enterprise Edition y opta por la reconstrucción de índices en línea, tenga en cuenta que la reconstrucción de índices en línea es una operación más larga que la reconstrucción de ellos sin conexión. Si puede permitirse el tiempo de inactividad, se recomienda una reconstrucción de índice fuera de línea, ya que es más rápido.

La desfragmentación de los índices es una parte clave del mantenimiento del rendimiento. Para entender mejor el problema, comencemos con cómo funcionan los índices. Nos centraremos en los índices no agrupados por ahora.

Un índice no agrupado es una estructura auxiliar de una tabla. Almacena copias de los datos de las filas en la tabla para las columnas especificadas en la clave, así como cualquier columna incluida adicional. Ignoraremos las columnas incluidas y nos enfocaremos en la clave. Debajo de la capucha esto toma la forma de una estructura de b-tree. El nivel inferior (hoja) del cual contiene los datos reales.

Las columnas clave definen cómo se ordenan las filas en un índice. Cuando insertemos una fila en un índice, SQL Server necesitará averiguar en qué página debe vivir esa fila. Si no hay suficiente espacio libre para que la fila encaje en la página, la página se dividirá en dos páginas. Es en este punto que se incluye la configuración del factor de relleno. El factor de relleno dejará un porcentaje del espacio de la página libre para que se inserten las filas más adelante. Esto tiene un precio sin embargo. Inmediatamente obtendrá menos densidad de página (menos filas por página). Cuanto más grande sea la tabla, más evidente será el problema, ya que su índice ocupará más espacio en el disco y, por lo tanto, será más lento de leer. Al cambiar el factor de relleno del valor predeterminado, es posible que introduzcas un problema mucho mayor en tu entorno. Así que prueba de prueba.

Vamos a hablar sobre las formas de eliminar la fragmentación de un índice.

La primera es una operación de RECONSTRUCCIÓN. Esto crea una estructura completamente nueva y deja caer la antigua. Dependiendo de su edición de SQL Server, puede hacer esto como una operación en línea. De lo contrario, el índice será inaccesible durante la operación de reconstrucción. Generalmente se recomienda reconstruir un índice con fragmentación de más del 30%.

La otra opción es reorganizar el índice. Esta operación solo funciona a nivel de la hoja, por lo que es más eficiente. También es siempre una operación en línea. Generalmente es ideal para tratar la fragmentación entre el 10% y el 30%.

Si sus índices están particionados, puede reconstruir algunas particiones y reorganizar otras. Los scripts de Ola Hallengren (mantenimiento de índices y estadísticas de SQL Server) hacen un gran trabajo en este sentido y en el mantenimiento de índices en general. Entonces, ¿cuándo debería considerar la partición? Diría que cuando tu mesa crezca lo suficiente como para que lo veas como un problema potencial en el futuro. Tiendo a empezar a pensar en particionar en algún momento alrededor de la marca de 40GB.

En cuanto a la frecuencia con la que debe ejecutar el mantenimiento del índice, diría que depende. Idealmente a diario. Pero dependerá de su entorno.

Si estás hablando de índices SQL para tablas:

ALTERAR EL ÍNDICE PK_ID EN TU RECONSTRUCCIÓN;

donde YOURTABLE es el nombre de su tabla SQL y el ID de ID de PK_ID de la clave principal en su pestaña; e.

Si está hablando de índices de mercado, necesita datos de cotizaciones de acciones y datos de constituyentes de índices. Entonces puedes compilar un índice de mercado.