Réorganiser et réduire n'est jamais recommandé.
Si vous pouvez utiliser les applications que la base de données sert en mode hors connexion, vous pouvez accélérer le processus et réduire la fragmentation des index en supprimant tous les index et les contraintes de clé primaire / étrangère avant la réduction (cela signifiera qu'il y a moins de données à déplacer, car seul le les pages de données seront mélangées et non les pages d'index maintenant inexistantes, ce qui accélérera le processus) puis recréera tous les index et les clés.
Recréer les index après la réduction signifie qu'ils ne doivent pas être fragmentés de manière significative. Si vous les supprimez pendant la réduction, leur reconstruction ne laissera pas beaucoup de petits "trous" dans l'allocation de page dans les fichiers susceptibles d'inviter la fragmentation ultérieurement.
Une autre option si vous pouvez déconnecter les applications consiste à migrer toutes les données vers une nouvelle base de données de la même structure. Si votre processus de construction est solide, vous devriez être capable de construire rapidement cette base de données vierge. Sinon, créez-en une à partir de la base de données actuelle (restaurez une sauvegarde de la base de données actuelle, tronquez / supprimez tout le contenu des tables et effectuez une réduction complète).
Vous voudrez peut-être quand même supprimer tous les index de la destination et les recréer par la suite, car cela peut s'avérer beaucoup plus efficace lorsque vous modifiez une grande partie des données indexées (100% dans ce cas). Pour accélérer le processus de copie, placez le (s) fichier (s) de données de la base de données de destination sur différents lecteurs physiques à la source (sauf si vous utilisez des disques SSD, auquel cas vous ne devez pas vous soucier de réduire les mouvements de la tête), vous pouvez les déplacer. à l'emplacement source lorsque vous avez terminé.
De même, si vous créez la destination en tant que nouvelle (plutôt que de masquer une copie de la source), créez-la avec une taille initiale qui contiendra toutes les données actuelles plus quelques mois de croissance, ce qui accélérera la copie des données à nouveau. il ne sera pas allouer un nouvel espace de temps en temps tout au long du processus.
Cela peut être préférable à l’utilisation de shrink, car la migration des données vers une nouvelle base de données reproduit l’action souhaitée de l’opération de réduction, mais potentiellement avec beaucoup moins de fragmentation (conséquence involontaire d’une réorganisation entre deux fonctions). Un raccourci prend simplement des blocs proches de la fin du fichier et les met dans le premier espace plus près du début, ne faisant aucun effort pour conserver ensemble les données associées.
Je pense que le résultat sera également plus efficace du point de vue de l'espace, car il est probable que les pages moins utilisées par la suite. Une réduction ne fait que déplacer les pages partiellement utilisées. Le déplacement des données a plus de chances de générer des pages entières, en particulier si vous insérez dans la destination dans l'ordre de la clé / index en cluster de la table (où une table en a une) et créez d'autres index. après que toutes les données aient migré.
Bien sûr, si vous ne pouvez pas du tout mettre les applications hors ligne, vous ne pouvez qu'effectuer une réduction de volume, donc si vous avez vraiment besoin de récupérer de l'espace, utilisez-le. En fonction de vos données, des modèles d'accès, de la taille de l'ensemble de travail commun, de la quantité de RAM dont dispose le serveur, etc., la fragmentation interne supplémentaire risque de ne pas être très significative.
Pour l’opération de copie, SSIS ou T-SQL de base fonctionnerait tout aussi bien (l’option SSIS pourrait être moins efficace, mais potentiellement plus facile à gérer ultérieurement). Si vous créez les relations FK à la fin avec les index, vous pouvez effectuer un simple "pour chaque table, copier" dans les deux cas. Bien sûr, pour un cas isolé, une rétraction + une réorganisation est probablement acceptable aussi, mais j'aime juste effrayer les gens pour qu'ils ne considèrent jamais les rétrécissements réguliers! (J'ai connu des gens les programmer tous les jours).
Si vous manquez d'espace et que vos données ne sont pas supposées devenir aussi volumineuses, réduisez-les, mais reconstruisez ensuite vos index avec des facteurs de remplissage appropriés qui permettent une croissance typique.
Si votre objectif final est réellement de réduire la taille de la sauvegarde, veillez à mettre en œuvre une stratégie de sauvegarde complète pour effacer le journal des transactions. Lorsque vous sauvegardez la base de données, utilisez les options de compression.
Je ne recommanderais pas la croissance automatique de 5 Go à moins que vous vous attendiez généralement à augmenter régulièrement la taille de 5 Go. Sinon, vous pourriez avoir des problèmes de performance intermittents. La taille de vos données doit d’abord être définie sur ce que vous pensez être nécessaire pour une année, par exemple, et sur Auto Growth, sur une taille que vous avez testée, n’affectant pas les performances d’exploitation. Voir Ne touchez pas ce bouton Réduire la base de données dans SQL Server! par Mike Walsh.
La reconstruction des index avant la réduction entraîne une mauvaise présentation des index. Ce n'est pas bon de reconstruire puis rétrécir. La réduction fait que les index doivent être mutilés pour récupérer de l’espace - il est donc inutile de les reconstruire à l’avance puis de les réduire. Voir Quand utiliser Auto Shrink de Thomas LaRock.
la source
Je ne sais pas si cela fonctionnerait mieux que de réindexer après la réduction, mais une autre option consisterait à créer un nouveau fichier de données de la taille appropriée et à y transférer toutes les données. Dans ce cas, je voudrais d'abord effectuer une réindexation afin que vous sachiez quelle est la taille réelle des données. L'un des inconvénients est que s'il s'agit du premier fichier du fichier de données primaire, je ne pense pas que vous puissiez le vider. Vous devriez être en mesure de la réduire, puis de déplacer les données vers l’arrière, ce qui éviterait l’inversion de page. Cependant, si vous envisagez de passer à l'état solide, cela ne devrait de toute façon pas faire une grande différence.
la source
Revenons à cette manière tardive. Néanmoins, nous réfléchissons et testons également l’utilisation du retrait dans nos environnements de test depuis longtemps. Selon le sujet, il arrive parfois que la réduction soit une option viable. Mais savoir quand et comment l'appliquer est vital pour une exécution correcte à court et à long terme.
Dans notre scénario, nous avons récemment ajouté de nombreuses modifications à notre base de données volumineuse, notamment la compression, le partitionnement, l'archivage et la suppression complète des données redondantes. En conséquence, la partie utilisée de notre fichier de données principal est tombée à moins de la moitié de ce qu’elle était. Mais quel est l'intérêt de transporter tous ces bagages? D'autant que contrairement à certains articles sur le Web, la taille de vos fichiers de données est corrélée directement à la durée de la sauvegarde / restauration. En effet, contrairement à de nombreux articles, les scénarios de la vie réelle chargent plus de données sur une page donnée que les éléments que vous avez éventuellement supprimés.
Plus précisément, cela ouvre un grand scénario pour la réduction:
De cette façon, les seules données restantes seraient les objets système, les statistiques, les procédures, etc. de votre base de données. La réduction devrait être beaucoup, BEAUCOUP plus rapide, et aucune autre maintenance de l’index sur vos principaux objets de données n’a besoin d’être maintenue, de manière à réduire au minimum les risques de fragmentation future.
la source