Quand est-il possible de réduire une base de données?

43

Je sais que rétrécir est le diable: il inverse l'ordre des pages et est responsable du cancer de la peau, de la fragmentation des données et du réchauffement de la planète. La liste est longue ... Cela étant dit, disons que j'ai une base de données de 100 Go et que je supprime 50 Go de données - pas sur une table, mais une taille générale des données anciennes au niveau de la base de données, couvrant 90% des tables - cela constitue-t-il un cas d'utilisation approprié pour réduire la base de données?

Si non, quelles sont les mesures appropriées à prendre pour nettoyer la maison après avoir supprimé un pourcentage aussi élevé de données d'une base de données? Je peux penser à deux: reconstruire les index et mettre à jour les statistiques. Quoi d'autre?

bumble_bee_tuna
la source

Réponses:

13

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

David Spillett
la source
16

La base de données va-t-elle s'agrandir à nouveau? Si tel est le cas, les efforts que vous allez déployer dans les opérations de réduction de stock ne seront plus qu'un gaspillage, car lorsque vous aurez réduit la taille du fichier et ajouté plus de données, le fichier devra simplement croître à nouveau, et les transactions doivent attendre que cette croissance se produise. Si vous avez des paramètres de croissance automatique sous-optimaux et / ou un lecteur lent, cette activité de croissance va être assez pénible.

Si vous réduisez la base de données, à quoi allez-vous utiliser l'espace disque libéré? Encore une fois, si vous voulez simplement garder cet espace libre au cas où cette base de données s'agrandisse à nouveau, alors vous faites tourner votre roue.

Ce que vous pourriez envisager de faire, maintenant que vous avez tout cet espace libre dans le fichier, est de reconstruire vos index pour qu'ils soient mieux optimisés (et ce sera beaucoup moins pénible de le faire si vous avez suffisamment d'espace libre pour le faire - penser à essayer de changer un pull dans un petit placard par rapport à une grande chambre).

Par conséquent, à moins qu'il s'agisse d'une opération de nettoyage importante et que vous n'utilisiez plus vraiment le même niveau de données, je la laisserais telle quelle et me concentrerai sur d'autres domaines d'optimisation.

Aaron Bertrand
la source
@Aarron Bertrand Eh bien, il a fallu 10 ans pour obtenir ce gros disque, et le problème est un peu préoccupant, car j'aimerais le mettre en état solide. Je pensais réduire à 60 Go avec une croissance automatique de 5 Go. Vraiment, la seule chose que vous recommanderiez serait de reconstruire les index, hein? Je pensais que les gens auraient d'autres recommandations.
bumble_bee_tuna
Et je ne recommanderais la reconstruction que s’ils en ont besoin. Mais je le ferais avant de réduire le fichier. Je ne peux vraiment pas penser à quelque chose que je ferais avec un espace libre qui permettrait d'optimiser les performances dans le cas général ...
Aaron Bertrand
2

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.

GilesDMiddleton
la source
Si vous réduisez puis reconstruisez les index, le fichier de données devra à nouveau s'agrandir pour pouvoir accueillir la copie des données utilisées pour la reconstruction. Même s'il ne sera pas aussi volumineux que le fichier de données d'origine, il s'agira toujours d'une croissance et cela semblera contre-productif. La reconstruction alors qu'il y a de l'espace libre sera plus rapide (pas de croissance automatique requise) et sera toujours meilleure que ce que vous suggérez sur la façon dont les pages sont présentées pour la nouvelle copie de l'index. et conduire à la même ou meilleure récupération de l'espace disque. Peut-être le temps pour quelques tests.
Aaron Bertrand
Et bien sûr, cela suppose que les index sur les données restantes devront en réalité être reconstruits - ils sont peut-être déjà en assez bonne forme.
Aaron Bertrand
1

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.

cfradenburg
la source
1

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:

  1. Créez un script qui trouvera tous les objets et leurs groupes de fichiers dans votre base de données (de nombreux exemples en ligne), utilisez-le pour créer les clauses de suppression ainsi que pour créer des définitions pour chacun de vos index et contraintes.
  2. Créez un nouveau fichier et groupe de fichiers et faites-le par défaut.
  3. Supprimer tous les index non clusterisés (note, certains index peuvent être des contraintes).
  4. Créez vos index clusterisés sur le nouveau groupe de fichiers avec DROP_EXISTING = ON (ce qui, au fait, est une opération extrêmement rapide et journalisée au départ, comparée à de nombreuses alternatives).
  5. Recréez vos index non clusterisés.
  6. Enfin, RESSOURCEZ votre ancien fichier de données (généralement PRIMARY).

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.

Kahn
la source