web-dev-qa-db-fra.com

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

Je sais que le rétrécissement 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 climatique. La liste continue ... 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 seule table, mais un élagage général des anciennes données à l'échelle de la base de données, couvrant 90% de la tables - cela constitue-t-il un cas d'utilisation approprié pour réduire la base de données?

Sinon, 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?

44
bumble_bee_tuna

Une réorganisation et un rétrécissement ne sont jamais vraiment recommandés.

Si vous pouvez mettre les applications que la base de données dessert hors ligne, 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 signifie 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, accélérant le processus), puis recréeront tous les index et les clés.

Recréer les index après la réduction signifie qu'ils ne devraient pas être considérablement fragmentés, et les avoir supprimés pendant la réduction signifie que leur reconstruction ne laissera pas beaucoup de petits "trous" dans l'allocation de page dans les fichiers qui peuvent inviter à une fragmentation plus tard.

Une autre option si vous pouvez déconnecter les applications est de 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 pouvoir créer cette base de données vide rapidement, sinon en créer une à partir de la base de données actuelle (restaurer une sauvegarde de la base de données actuelle, tronquer/supprimer tout le contenu des tableaux et effectuer une réduction complète).

Vous pouvez toujours vouloir supprimer tous les index dans la destination et les recréer ensuite car cela peut être beaucoup plus efficace lors de la modification de nombreuses données indexées (100% dans ce cas). Pour accélérer le processus de copie, ayez les fichiers de données de la base de données de destination sur différents disques physiques vers la source (sauf si vous utilisez des SSD, auquel cas vous n'avez pas besoin de vous soucier de réduire les mouvements de la tête), vous pouvez les déplacer à l'emplacement source lorsque vous avez terminé.

De plus, si vous créez la destination comme nouvelle (plutôt qu'en supprimant une copie de la source), créez-la avec une taille initiale qui contiendra toutes les données actuelles plus quelques mois de croissance - cela rendra la copie de données un peu plus rapide à nouveau car il n'allouera pas de nouvel espace de temps en temps tout au long du processus.

Cela peut être préférable à l'utilisation de la réduction, car la migration des données vers une nouvelle base de données reproduit l'action prévue de l'opération de réduction, mais potentiellement avec une fragmentation beaucoup moins importante (ce qui est la conséquence involontaire d'une réorganisation et d'une réduction). Un pseudo prend simplement des blocs de près de la fin du fichier et les place dans le premier espace plus près du début sans faire d'effort pour garder les données liées ensemble.

Je soupçonne que le résultat sera également plus efficace en termes d'espace, car il y aura probablement moins de pages partiellement utilisées par la suite. Un rétrécissement ne fera que déplacer les pages partiellement utilisées, le déplacement des données est plus susceptible de générer des pages complètes, surtout si vous insérez dans la destination dans l'ordre de la clé/index cluster d'une table (où une table en a une) et créez d'autres index une fois que les données ont toutes migré.

Bien sûr, si vous ne pouvez pas du tout mettre les applications hors ligne, effectuer une réduction est votre seule option, donc si vous vraiment devez récupérer l'espace, allez avec cela. En fonction de vos données, des modèles d'accès, de la taille courante du jeu de travail, de la quantité RAM que le serveur possède, etc.), la fragmentation interne supplémentaire peut ne pas être si importante à la fin.

Pour l'opération de copie, SSIS ou T-SQL de base fonctionneraient 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 faire un simple "pour chaque table, copier" dans les deux cas. Bien sûr, pour une seule fois, un rétrécissement + réorganisation est probablement bien aussi, mais j'aime juste faire peur aux gens de ne jamais envisager de rétrécissements réguliers! (Je connais des gens qui les planifient quotidiennement).

14
David Spillett

La base de données va-t-elle croître à nouveau? Si c'est le cas, l'effort que vous allez mettre dans les opérations de réduction sera juste un gaspillage, car lorsque vous aurez réduit la taille du fichier et que vous ajouterez plus de données, le fichier devra simplement s'agrandir à 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 très douloureuse.

Si vous réduisez la base de données, pourquoi allez-vous utiliser l'espace disque libéré? Encore une fois, si vous voulez simplement laisser cet espace libre au cas où cette base de données se développerait à nouveau, alors vous faites simplement tourner vos roues.

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

Donc, à moins que ce ne soit une opération de nettoyage majeure et que vous n'accélérerez vraiment pas au même niveau de données, je le laisserais tel quel et me concentrerais sur d'autres domaines d'optimisation.

16
Aaron Bertrand

Si vous manquez d'espace et que vos données ne sont pas censées devenir aussi importantes, réduisez-les, mais reconstruisez vos indices après 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, assurez-vous de mettre en œuvre une stratégie de sauvegarde complète pour effacer le journal des transactions et lorsque vous sauvegardez la base de données, utilisez les options de compression.

Je ne recommanderais pas une croissance automatique de 5 Go, sauf si vous vous attendez généralement à une croissance fréquente de 5 Go. Sinon, vous pourriez avoir des problèmes de performances intermittents. La taille de vos données doit d'abord être définie sur ce que vous pensez être nécessaire pour, disons, un an, et la croissance automatique doit être définie sur une taille que vous avez testée n'affecte pas les performances d'exploitation. Voir Ne touchez pas ce bouton de réduction de la base de données dans SQL Server! par Mike Walsh.

Reconstruire les index avant de les réduire entraîne une mauvaise disposition des index. Ce n'est pas bon de reconstruire puis de rétrécir. Le rétrécissement fait que les index sont déformés pour récupérer de l'espace - donc la reconstruction préalable puis le rétrécissement sont inutiles. Voir Quand utiliser la réduction automatique par Thomas LaRock.

2
GilesDMiddleton

Revenons à cette façon tard. Pourtant, nous réfléchissons et testons également l'utilisation de la réduction dans nos environnements de test depuis longtemps. Selon le sujet, il y a sont fois où la réduction est une option viable. Mais savoir quand et comment l'appliquer est essentiel à une bonne exécution à long et à court terme.

Dans notre scénario, nous avons récemment ajouté de nombreuses modifications à notre grande base de données, notamment la compression, le partitionnement, l'archivage et la suppression ancienne et simple des données redondantes. Par conséquent, la partie utilisée de notre fichier de données principal a chuté à moins de la moitié de ce qu'elle était. Mais à quoi bon transporter tous ces bagages? D'autant plus que contrairement à certains articles sur le Web, la taille de vos fichiers de données CORRESPOND DIRECTEMENT À LA DURÉE DE SAUVEGARDE/RESTAURATION. En effet, contrairement à de nombreux articles, les scénarios réels contiennent beaucoup plus de données sur une page donnée que les éléments que vous avez peut-être supprimés.

Plus précisément, cela ouvre un excellent scénario de 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 drop ainsi que créer des définitions pour chacun de vos index et contraintes.
  2. Créez un nouveau fichier et groupe de fichiers et définissez-le par défaut.
  3. Supprimez tous les indices non clusterisés (notez que certains indices peuvent être des contraintes).
  4. Créez vos index clusterisés sur le nouveau groupe de fichiers avec DROP_EXISTING = ON (ce qui, en fait, est une opération extrêmement rapide et minimalement journalisée pour commencer par rapport à de nombreuses alternatives).
  5. Recréez vos indices non clusterisés.
  6. Enfin, RÉTRÉCIEZ votre ancien fichier de données (généralement PRIMAIRE).

De cette façon, les seules données qui y resteraient seraient les objets système de votre base de données, les statistiques, les procédures et ainsi de suite. Le rétrécissement devrait être beaucoup, BEAUCOUP plus rapide, et il n'y a aucun besoin de maintenance d'index supplémentaire sur vos principaux objets de données qui auront été créés soigneusement dans l'ordre et un risque minimal de fragmentation future.

1
Kahn

Je ne sais pas si cela fonctionnerait mieux que la réindexation après la réduction, mais une autre option serait de créer un nouveau fichier de données de taille appropriée et de déplacer toutes les données vers cela. Dans ce cas, je ferais d'abord une réindexation afin que vous sachiez quelle est la taille réelle des données. Un hic, c'est que s'il s'agit du premier fichier du fichier de données principal, je ne pense pas que vous puissiez le vider. Vous devriez être en mesure de le réduire, puis de reculer les données par la suite et cela éviterait l'inversion de la page. Cependant, si vous envisagez de passer à l'état solide, cela ne devrait pas faire une grande différence de toute façon.

1
cfradenburg