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

Índice reanudable de SQL Server:¿Es bueno para usted?

SQL 2017 introdujo la capacidad de pausar y reanudar las operaciones de reconstrucción de índices durante el mantenimiento de la base de datos. Esta función ofrece más flexibilidad a los administradores de bases de datos, ya que les permite elegir entre la reindexación en línea y fuera de línea, además de pausar y reanudar la reconstrucción del índice cuando sea necesario.

Antes del lanzamiento del índice reanudable, los administradores de la base de datos podían ejecutar la reconstrucción del índice fuera de línea y en línea .

Sin conexión ofrece una ejecución más rápida, ya que la tabla está bloqueada para cualquier lectura o escribir operación, y el nuevo índice se crea a partir del índice anterior. Durante este proceso, no se permite ninguna operación de lectura o escritura. Cuando finaliza la operación, se libera el bloqueo de la tabla y se permiten de nuevo las operaciones de lectura y escritura. El Fuera de línea La opción es naturalmente más rápida.

En línea mantiene la tabla abierta para leer y escribir operaciones. Hay otra copia del índice realizada y todas las operaciones de reconstrucción del índice están en esa copia. Todas las operaciones de filas nuevas se escriben en ambos índices. Cuando se completa la reconstrucción, se realiza el cambio y se utiliza la nueva copia del índice. El En línea reconstruir permite operaciones de reconstrucción mientras la base de datos está en línea. El tiempo de inactividad es mínimo.

Tenga en cuenta que la función de índice reanudable solo está disponible en la edición Enterprise de SQL Server y la edición Developer gratuita. Si tiene esta opción sobre la mesa, puede jugar con ella, hacer una prueba simple y ver si esta característica es útil en su caso.

La documentación de Microsoft establece los siguientes aspectos para su consideración:

  • Puede administrar, planificar y extender las ventanas de mantenimiento de índices. Puede pausar y reiniciar las operaciones de creación o reconstrucción de índices cuando necesite ajustar sus ventanas de mantenimiento.
  • Puede recuperarse de las fallas de creación o reconstrucción del índice (como fallas en la base de datos o quedarse sin espacio en disco).
  • Preste atención a que cuando una operación de índice está en pausa, tanto el índice original como el recién creado requerirán espacio en disco. Deberá actualizarlos durante las operaciones DML.
  • Puede habilitar el truncamiento de los registros de transacciones durante las operaciones de creación o reconstrucción del índice.
  • Tenga en cuenta que la opción SORT_IN_TEMPDB=ON no es compatible

Probemos la reconstrucción del índice reanudable. Usaré una imagen de contenedor que ejecute la edición SQL 2019 Server Developer. Además, crearé una tabla pequeña con solo un par de columnas e insertaré alrededor de un millón de filas en esa tabla. Puede hacer que la tabla crezca con más filas.

Como estoy usando una máquina Linux y no puedo instalar SQL Server Management Studio, usaré el cliente de Azure Data Studio para conectarme a mi SQL Server. Eche un vistazo a la captura de pantalla de mis propiedades de SQL Server:

Crearemos una base de datos de muestra, una tabla y un índice con los siguientes scripts T-SQL. Puede ejecutarlos sin problemas con SSMS o dbForge Studio para SQL Server:

-- Create a new database called 'DatabaseName' 
-- Connect to the 'master' database to run this snippet 
USE master 
GO 
-- Create the new database if it does not exist already 
IF NOT EXISTS ( 
SELECT [name] 
FROM sys.databases 
WHERE [name] = N'dbatools' 
) 
CREATE DATABASE dbatools 
GO
Use dbatools 

-- Create a new table called '[TableName]' in schema '[dbo]' 
-- Drop the table if it already exists 
IF OBJECT_ID('[dbo].[TabletoIndex]', 'U') IS NOT NULL 
DROP TABLE [dbo].[TabletoIndex] 
GO 
-- Create the table in the specified schema 
CREATE TABLE [dbo].[TabletoIndex] 
( 
[Id] INT NOT NULL PRIMARY KEY, -- Primary Key column 
[ColumnName1] NVARCHAR(50) NOT NULL 
-- Specify more columns here 
); 
GO 

Para llenar la tabla con datos aleatorios, ejecute el siguiente script:

--populate the table 
SET NOCOUNT ON 
Declare @Id int 
Set @Id = 1 
While @Id <= 1000000 
Begin 
Insert Into TabletoIndex values (@Id, 'Name - ' + CAST(@Id as nvarchar(10))) Set @Id = @Id + 1 
End 
SELECT count(*) from TabletoIndex 

Con una tabla poblada lista, podemos proceder al índice reanudable. Comencemos con la creación de ese índice:

-- Create a nonclustered index with or without a unique constraint -- Or create a clustered index on table '[TableName]' in schema '[dbo]' in database '[DatabaseName]' 
CREATE UNIQUE INDEX IX_ID_Name ON [dbo].[TabletoIndex] (ID desc, [ColumnName1] DESC) WITH (SORT_IN_TEMPDB = OFF, RESUMABLE=ON, ONLINE = ON, MAX_DURATION=1) GO

Observe las nuevas opciones/parámetros en el comando anterior. RESUMIBLE=ENCENDIDO significa que queremos tener una operación de índice reanudable. Duración_máxima es el valor en minutos que define cuánto tiempo queremos que se ejecute la indexación.

Mientras se ejecuta el comando anterior, abra otra sesión y ejecute el siguiente comando T-SQL para PAUSAR la actividad de reconstrucción en curso:

--Rebuild WITH RESUMABLE functionality 
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] PAUSE 
GO 

Si la PAUSA el comando es exitoso, pausamos la operación de indexación actual iniciada hace aproximadamente un minuto. Sin embargo, cuando regresa a la sesión anterior para el comando de reconstrucción con resumable=ON , devuelve un error feo. Puaj. Pero sí, ese es el comportamiento esperado.

Con esta reconstrucción de índice reanudable, SQL Server también introdujo un nuevo DMV sys.index_resumable_operations para comprobar las operaciones en pausa. Intentemos investigar este DMV:

La consulta de resultados del DMV devuelve mi comando de reconstrucción de índice, el porcentaje completado es una gran cosa, y más. Cuando se realizan todas las operaciones de reconstrucción de índices, el DMV devuelve vacío:

Bastante ordenado, ¿eh?

Pero, ¿y si cambias de opinión sobre la mesa? ¿Qué sucede si hubo un cambio en los requisitos y necesita realizar cambios en el diseño de la base de datos? Intentemos tirar la mesa:

Dará otro mensaje de error feo y largo:

Mensaje 10637, nivel 16, estado 1, línea 1
No se puede realizar esta operación en el "objeto" con ID 581577110 porque uno o más índices se encuentran actualmente en estado de reconstrucción de índice reanudable. Consulte sys.index_resumable_operations para obtener más detalles.
Tiempo total de ejecución:00:00:00.018

A partir de aquí, se dará cuenta de que no tiene más remedio que ABORTAR por completo la operación o REANUDAR y dejar que se complete la reconstrucción.

Consulte el comando T-SQL para reanudar o cancelar la operación. Luego puede soltar la tabla con éxito:

ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] RESUME 
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] ABORT 

También se producirá el mismo error si necesita realizar otras operaciones, como descartar totalmente el índice o eliminar la sesión actual.

Pero te preguntas, ¿es la opción reanudable en primer lugar? La respuesta es no. Para SQL 2019, toda la creación de índices se realiza con RESUMABLE=ON de forma predeterminada. Es debido a estas 2 declaraciones de alcance:

ALTER DATABASE SCOPED CONFIGURATION SET ELEVATE_ONLINE=WHEN_SUPPORTED ALTER DATABASE SCOPED CONFIGURATION SET ELEVATE_RESUMABLE=WHEN_SUPPORTED 

Resumen

El impacto del uso de la opción reanudable en el rendimiento no es diferente al uso de la operación de reindexación normal. SQL Server simplemente le brinda más control sobre las operaciones de mantenimiento de su base de datos.

En cuanto a los requisitos de reconstrucción del índice de la tabla periódica, la mejor práctica sigue siendo ejecutar operaciones de índice fuera de línea, o al menos durante las horas de menor actividad para garantizar un impacto comercial mínimo.