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

3 métodos para reconstruir todos los índices para todas las tablas con T-SQL en la base de datos de SQL Server

Existen varios métodos para reconstruir todos los índices de todas las tablas en SQL Server, entre ellos:

  1. Uso de planes de mantenimiento de SQL Server.
  2. Uso de script T-SQL basado en el porcentaje de fragmentación.
  3. Usando el comando ALTER INDEX.

En este artículo, exploraremos estos métodos y los ilustraremos con ejemplos prácticos.

1. Plan de mantenimiento del índice de reconstrucción de SQL Server

La primera opción a revisar es la reconstrucción de índices con los planes de mantenimiento de la base de datos. Los planes de mantenimiento están disponibles en la carpeta de administración de SQL Server Management Studio.

Para crear un plan de mantenimiento de la base de datos SQL, inicie SQL Server Management Studio > expandir la instancia de la base de datos > Administración > haga clic derecho en el plan de mantenimiento > Nuevo Plan de Mantenimiento .

Especifique el nombre del plan de mantenimiento. Luego, arrastre y suelte Reconstruir tarea de índice en el diseñador del plan de mantenimiento. Cambie el nombre de la tarea a Mantenimiento de índice .

El siguiente paso es configurar el plan de mantenimiento. Haga doble clic en él y configure las opciones en Reconstruir tarea de índice de la siguiente manera:

  • Seleccione AdventureWorks2017 base de datos del menú desplegable Base de datos.
  • Para reconstruir índices de todas las tablas, seleccione Tablas y vistas del Objeto cuadro desplegable.
  • Marque Ordenar resultados en tempdb .
  • MAXDOP – establecer 2 (dos).
  • En nuestro caso, reconstruiremos los índices solo si la Fragmentación valor es superior al 20%. Por lo tanto, establezca 20 en el campo respectivo.
  • Haga clic en Aceptar para guardar la configuración del índice y cerrar la tarea de reconstrucción del índice ventana.

Ahora, configuremos el horario.

Haga clic en el calendario icono en la parte superior del diseñador del plan de mantenimiento:

El Nuevo calendario laboral se abrirá la ventana. Configuremos los siguientes ajustes:

  • Ejecute el trabajo todos los días. En el Tipo de horario menú, seleccionamos Recurrente . Luego, en la Frecuencia sección, seleccionamos Ocurre > Diario .
  • Se repite cada > 1 (día).
  • Frecuencia diaria > Ocurre una vez en > especificar la hora exacta. En nuestro caso, es la 1 AM.
  • Haga clic en Aceptar .

Después de eso, guarde el plan de mantenimiento.

Los planes de mantenimiento creados están disponibles en el SSMS Plan de mantenimiento directorio. Para ver el cronograma asociado con el plan de mantenimiento en particular, consulte los Trabajos directorio bajo Agente SQL Server .

Para probar el trabajo, haga clic derecho en su nombre en los Planes de mantenimiento directorio y seleccione Ejecutar del menú:

Comienza la ejecución. Cuando se complete con éxito, verá el siguiente cuadro de diálogo:

Este era el método común de reconstrucción de índices con planes de mantenimiento. Ahora, pasemos al siguiente método:usar los scripts T-SQL.

2. Reconstrucción de SQL Server ALTER INDEX

El comando ALTER INDEX se puede utilizar para reconstruir todos los índices de la tabla. La sintaxis es la siguiente:

ALTER INDEX ALL ON [table_name] REBUILD

Nota:table_name El parámetro especifica el nombre de la tabla donde queremos reconstruir todos los índices en SQL Server.

Por ejemplo, queremos reconstruir todos los índices de [HumanResources].[Employee] . La consulta debe ser la siguiente:

use AdventureWorks2017
go
ALTER INDEX ALL ON [HumanResources].[Employee] REBUILD
Go

3. Script de SQL Server para reconstruir todos los índices de todas las tablas según la fragmentación

El mantenimiento de índices requiere muchos recursos. Además, bloquea la tabla donde está reconstruyendo el índice. Para evitar tales complicaciones, debemos reconstruir el índice donde la fragmentación del índice de SQL Server es superior al 40%.

Para ilustrar el caso, he creado un script T-SQL que reconstruye índices con un grado de fragmentación superior al 30%. Exploremos sus partes y funciones.

Declaración de variables y tablas temporales

Primero, necesitamos crear tablas temporales y variables:

  • @IndexFregQuery – almacena la consulta dinámica utilizada para llenar índices fragmentados.
  • @IndexRebuildQuery – contiene la consulta ALTER INDEX.
  • @NombreÍndice – el nombre del índice que queremos reconstruir
  • @NombreDeTabla – el nombre de la tabla donde queremos reconstruir el índice.
  • @NombreEsquema – el nombre del esquema donde queremos reconstruir el índice.
  • #Fregmentedindex – la tabla de 3 columnas que almacena el nombre del índice, el nombre de la tabla y el nombre del esquema.

El siguiente código declara nuestras variables y la tabla temporal:

declare @i int=0
declare @IndexCount int
declare @IndexFregQuery nvarchar(max)
declare @IndexRebuildQuery nvarchar(max)
declare @IndexName varchar(500)
declare @TableName varchar(500)
declare @SchemaName varchar(500)
create table #Fregmentedindex(Index_name varchar(max),table_name varchar(max),schema_name varchar(max))

Obtener la lista de índices fragmentados

Nuestro siguiente paso es completar la lista de índices con un grado de fragmentación del 30 % o superior. Debemos insertar esos índices en #FregmentedIndexes mesa.

La consulta debe completar el nombre del esquema, el nombre de la tabla y el nombre del índice para insertarlos en la tabla temporal. Echa un vistazo a esa consulta:

set @IndexFregQuery='SELECT i.[name],o.name,sch.name
	FROM   [' + @DatabaseName + '].sys.dm_db_index_physical_stats (DB_ID('''+ @DatabaseName +'''), NULL, NULL, NULL, NULL) AS s
	INNER JOIN [' + @DatabaseName + '].sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
	INNER JOIN [' + @DatabaseName + '].sys.objects AS o ON i.object_id = o.object_id
	INNER JOIN [' + @DatabaseName + '].sys.schemas AS sch ON o.schema_id=sch.schema_id
	WHERE (s.avg_fragmentation_in_percent > 30 ) and i.name is not null'
insert into #Fregmentedindex(Index_name,table_name,schema_name) exec sp_executesql @IndexFregQuery

Cree una consulta SQL dinámica

Finalmente, debemos construir la dinámica ALTER INDEX comando y ejecútelo.

Para generar el comando, estamos usando el bucle WHILE. Itera a través de los #FregmentedIndexes tabla y rellena el nombre del esquema, el nombre de la tabla y el nombre del índice para guardarlos en @SchemaName , @NombreDeTabla y @NombreÍndice . Los valores de los parámetros se agregan en el comando ALTER INDEX.

El código es el siguiente:

set @IndexCount=(select count(1) from #Fregmentedindex)
While (@IndexCount>@i)
begin 
(select top 1 @TableName=table_name, @IndexName=Index_name,@SchemaName= schema_name from #Fregmentedindex)
Set @IndexRebuildQuery ='Alter index [' + @IndexName +'] on ['[email protected] +'].['[email protected]+'].[' + @TableName +'] rebuild'
exec sp_executesql @IndexRebuildQuery 
set @[email protected]+1
delete from #Fregmentedindex where [email protected] and [email protected]
End

He encapsulado todo el código en el sp_index_maintenance procedimiento almacenado creado en DBATools base de datos. El código es el siguiente:

use DBATools
go
Create procedure sp_index_maintenance_daily
@DatabaseName varchar(50)
as
begin
declare @i int=0
declare @IndexCount int
declare @IndexFregQuery nvarchar(max)
declare @IndexRebuildQuery nvarchar(max)
declare @IndexName varchar(500)
declare @TableName varchar(500)
declare @SchemaName varchar(500)
create table #Fregmentedindex(Index_name varchar(max),table_name varchar(max),schema_name varchar(max))
set @IndexFregQuery='SELECT i.[name],o.name,sch.name
	FROM   [' + @DatabaseName + '].sys.dm_db_index_physical_stats (DB_ID('''+ @DatabaseName +'''), NULL, NULL, NULL, NULL) AS s
	INNER JOIN [' + @DatabaseName + '].sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
	INNER JOIN [' + @DatabaseName + '].sys.objects AS o ON i.object_id = o.object_id
	INNER JOIN [' + @DatabaseName + '].sys.schemas AS sch ON o.schema_id=sch.schema_id
	WHERE (s.avg_fragmentation_in_percent > 30 ) and i.name is not null'
insert into #Fregmentedindex(Index_name,table_name,schema_name) exec sp_executesql @IndexFregQuery
set @IndexCount=(select count(1) from #Fregmentedindex)
While (@IndexCount>@i)
begin 
(select top 1 @TableName=table_name, @IndexName=Index_name,@SchemaName= schema_name from #Fregmentedindex)
Set @IndexRebuildQuery ='Alter index [' + @IndexName +'] on ['[email protected] +'].['[email protected]+'].[' + @TableName +'] rebuild'
exec sp_executesql @IndexRebuildQuery 
set @[email protected]+1
delete from #Fregmentedindex where [email protected] and [email protected]
End
End

Una vez que el procedimiento está listo, podemos configurar el trabajo de SQL.

Expanda Agente SQL Server > haz clic derecho en Empleos > Nuevo trabajo .

El Nuevo Trabajo Se abre una ventana donde debe especificar el nombre del trabajo deseado.

Para crear un paso de trabajo, vaya a Pasos sección> el Nuevo botón:

Accederá al paso de nuevo trabajo ventana para configurar ese paso.

Ingrese el nombre del paso deseado e ingrese el siguiente código en el cuadro de texto:

use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'

Para configurar el horario, vaya a Horarios > haga clic en Nuevo .

Nuestro trabajo debe ejecutarse a la 1:00 AM. En consecuencia, configuramos el horario:

  • Tipo de horario > Recurrente .
  • La Frecuencia sección> Ocurre > Diario ; Se repite cada > 1 (uno).
  • La Frecuencia diaria sección> Ocurre una vez en > 01:00:00.
  • Haga clic en Aceptar .

Será transferido nuevamente al Nuevo trabajo sección. Haz clic en Aceptar allí también para crear el trabajo.

El trabajo recién creado está disponible en Trabajos directorio bajo el Agente SQL Server carpeta.

Ahora necesitamos probar el trabajo:haga clic derecho sobre él y seleccione Iniciar trabajo...

El trabajo comienza y, una vez finalizado correctamente, verá el siguiente mensaje:

Si comparamos el índice agrupado con el índice no agrupado, veremos que la creación de un índice agrupado único aumenta la eficiencia del rendimiento de las consultas. Las vistas indexadas en SQL Server se pueden usar para acelerar la ejecución de consultas. Vea también cómo administrar índices usando SQL Index Manager.

Resumen

El artículo actual presentó tres formas funcionales de reconstruir índices de todas las tablas. Los hemos explorado todos con pautas paso a paso y ejemplos prácticos de índice SQL para ilustrar la configuración del trabajo. La elección de la variante adecuada es suya, y esperamos que este artículo le haya sido de ayuda.