Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

3 méthodes pour reconstruire tous les index pour toutes les tables avec T-SQL dans la base de données SQL Server

Il existe plusieurs méthodes pour reconstruire tous les index de toutes les tables dans SQL Server, parmi lesquelles :

  1. Utilisation des plans de maintenance SQL Server.
  2. Utilisation du script T-SQL basé sur le pourcentage de fragmentation.
  3. Utilisation de la commande ALTER INDEX.

Dans cet article, nous allons explorer ces méthodes et les illustrer avec des exemples pratiques.

1. Plan de maintenance de l'index de reconstruction SQL Server

La première option à examiner est la reconstruction des index avec les plans de maintenance de la base de données. Les plans de maintenance sont disponibles dans le dossier de gestion de SQL Server Management Studio.

Pour créer un plan de maintenance de base de données SQL, lancez SQL Server Management Studio > développez l'instance de base de données > Gestion > clic droit sur le plan de maintenance > Nouveau plan de maintenance .

Spécifiez le nom du plan de maintenance. Ensuite, faites glisser et déposez Tâche de reconstruction de l'index dans le concepteur du plan de maintenance. Renommez la tâche en Maintenance de l'index .

L'étape suivante consiste à configurer le plan de maintenance. Double-cliquez dessus et configurez les options de la tâche de reconstruction de l'index comme suit :

  • Sélectionnez AdventureWorks2017 base de données dans le menu déroulant Base(s) de données.
  • Pour reconstruire les index de toutes les tables, sélectionnez Tables et vues à partir de l'Objet liste déroulante.
  • Cochez Trier les résultats dans tempdb .
  • MAXDOP – définir 2 (deux).
  • Dans notre cas, nous reconstruirons les index uniquement si la fragmentation la valeur est supérieure à 20 %. Par conséquent, définissez 20 dans le champ respectif.
  • Cliquez sur OK pour enregistrer la configuration de l'index et fermer la tâche de reconstruction de l'index fenêtre.

Maintenant, configurons le calendrier.

Cliquez sur le calendrier icône en haut du concepteur de plan de maintenance :

Le Nouveau calendrier des tâches fenêtre s'ouvrira. Configurons les paramètres suivants :

  • Exécutez la tâche tous les jours. Dans le type de planification menu, nous sélectionnons Récurrent . Ensuite, dans la Fréquence section, nous sélectionnons Se produit > Quotidien .
  • Se répète tous les > 1 (jour).
  • Fréquence quotidienne > Se produit une fois à > préciser l'heure précise. Dans notre cas, il est 1h du matin.
  • Cliquez sur OK .

Après cela, enregistrez le plan de maintenance.

Les plans de maintenance créés sont disponibles dans le SSMS Plan de maintenance annuaire. Pour afficher le calendrier associé au plan de maintenance particulier, consultez les Jobs répertoire sous SQL Server Agent .

Pour tester la tâche, faites un clic droit sur son nom dans les Plans de maintenance répertoire, et sélectionnez Exécuter depuis le menu :

L'exécution commence. Lorsqu'il se termine avec succès, vous verrez la boîte de dialogue suivante :

C'était la méthode courante de reconstruction des index avec des plans de maintenance. Passons maintenant à la méthode suivante - en utilisant les scripts T-SQL.

2. Reconstruction SQL Server ALTER INDEX

La commande ALTER INDEX peut être utilisée pour reconstruire tous les index de la table. La syntaxe est la suivante :

ALTER INDEX ALL ON [table_name] REBUILD

Remarque :Le table_name paramètre spécifie le nom de la table où nous voulons reconstruire tous les index dans SQL Server.

Par exemple, nous voulons reconstruire tous les index de [HumanResources].[Employee] . La requête doit être la suivante :

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

3. Script SQL Server pour reconstruire tous les index de toutes les tables en fonction de la fragmentation

La maintenance de l'index est gourmande en ressources. De plus, il verrouille la table où il reconstruit l'index. Pour éviter de telles complications, nous devons reconstruire l'index où la fragmentation de l'index SQL Server est supérieure à 40 %.

Pour illustrer le cas, j'ai créé un script T-SQL qui reconstruit les index avec un degré de fragmentation supérieur à 30%. Explorons ses parties et ses fonctions.

Variables et déclaration de table temporaire

Tout d'abord, nous devons créer des tables et des variables temporaires :

  • @IndexFregQuery – stocke la requête dynamique utilisée pour remplir les index fragmentés.
  • @IndexRebuildQuery – contient la requête ALTER INDEX.
  • @IndexName – le nom de l'index que nous voulons reconstruire
  • @TableName – le nom de la table où l'on veut reconstruire l'index.
  • @SchemaName – le nom du schéma où nous voulons reconstruire l'index.
  • #Fregmentedindex – le tableau à 3 colonnes qui stocke le nom de l'index, le nom de la table et le nom du schéma.

Le code suivant déclare nos variables et la table temporaire :

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))

Obtenir la liste des index fragmentés

Notre prochaine étape consiste à remplir la liste des index avec un degré de fragmentation de 30 % ou plus. Nous devons insérer ces index dans les #FregmentedIndexes tableau.

La requête doit renseigner le nom du schéma, le nom de la table et le nom de l'index pour les insérer dans la table temporaire. Jetez un œil à cette requête :

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

Créer une requête SQL dynamique

Enfin, nous devons construire le dynamique ALTER INDEX commande et exécutez-la.

Pour générer la commande, nous utilisons la boucle WHILE. Il parcourt les #FregmentedIndexes table et remplit le nom du schéma, le nom de la table et le nom de l'index pour les enregistrer dans @SchemaName , @NomTable , et @IndexName . Les valeurs des paramètres sont ajoutées dans la commande ALTER INDEX.

Le code est le suivant :

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

J'ai encapsulé l'intégralité du code dans le sp_index_maintenance procédure stockée créée dans DBATools base de données. Le code est le suivant :

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

Une fois la procédure prête, nous pouvons configurer le Job SQL.

Développez Agent SQL Server > faites un clic droit sur Emplois > Nouvelle tâche .

Le Nouveau Travail fenêtre s'ouvre dans laquelle vous devez spécifier le nom du travail souhaité.

Pour créer une étape de tâche, accédez aux Étapes section> le Nouveau bouton :

Vous accéderez à l'étape Nouvelle tâche fenêtre pour configurer cette étape.

Saisissez le nom de l'étape souhaitée et saisissez le code suivant dans la zone de texte :

use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'

Pour configurer la planification, accédez à Planifications > cliquez sur Nouveau .

Notre travail devrait être exécuté à 1h00 du matin. En conséquence, nous configurons le calendrier :

  • Type de planification > Récurrent .
  • La fréquence section> Se produit > Quotidien ; Se répète tous les > 1 (un).
  • La fréquence quotidienne section> Se produit une fois à > 01:00:00.
  • Cliquez sur OK .

Vous serez transféré vers le Nouveau Travail section. Cliquez sur OK là aussi pour créer l'emploi.

L'emploi nouvellement créé est disponible dans les Emplois répertoire sous SQL Server Agent dossier.

Nous devons maintenant tester le travail :cliquez dessus avec le bouton droit de la souris et sélectionnez Démarrer le travail…

Le travail démarre et, une fois terminé, vous verrez le message suivant :

Si nous comparons l'index clusterisé à l'index non clusterisé, nous verrons que la création d'un index clusterisé unique augmente l'efficacité des performances des requêtes. Les vues indexées dans SQL Server peuvent être utilisées pour accélérer l'exécution des requêtes. Découvrez également comment gérer les index à l'aide de SQL Index Manager.

Résumé

L'article actuel a présenté trois façons fonctionnelles de reconstruire les index de toutes les tables. Nous les avons tous explorés avec des directives étape par étape et des exemples pratiques d'index SQL pour illustrer la configuration de la tâche. Le choix de la variante appropriée vous appartient et nous espérons que cet article vous a été utile.