La taille de la base de données SQL Server n'a pas diminué après la suppression d'un grand nombre de lignes.

26

Je ne suis pas bon en SQL, mais j'ai une base de données à maintenir.

Il n'y a presque plus de place pour cela, j'ai donc décidé de supprimer toutes les données pour, disons, l'année 2008. Après avoir exécuté la requête de suppression (environ 10 000 000 de lignes ont été nettoyées) et le nettoyage du journal des transactions, j'ai découvert que mon les actions n'ont eu aucun effet sur la taille de la base de données. Y a-t-il autre chose que je dois faire?

Marat
la source

Réponses:

16

Tout en rétrécissant est en effet dangereux pour les raisons mentionnées ici. Il y a un juste milieu entre la réponse de Jimbo et celle de John ... Vous devriez toujours sérieusement considérer si vous voulez ou non réduire votre base de données.

Dans un monde idéal - vous créeriez votre base de données avec beaucoup d'espace libre pour vous développer. J'appelle cela "Right Sizing" votre base de données. Vous permettriez à cet espace libre d'être là et vous ne vous efforceriez pas de le rendre et de garder votre taille totale juste à votre taille utilisée. Pourquoi? Parce que votre base de données finira par croître à nouveau .. Ensuite, vous rétrécirez à nouveau .. Et vous serez coincé dans ce modèle horrible de rétrécissements inutiles suivis de croissances - et tout le temps, comme certains l'ont souligné, augmenter la fragmentation de votre index.

J'ai blogué à ce sujet où j'ai exhorté les gens à " Ne touchez pas ce bouton de rétrécissement! " Mais parfois ... Parfois, vous devez. Si vous avez une grande base de données, vous venez de libérer un espace important et ne vous attendez pas à y repousser jamais - eh bien, il est normal d'envisager de rétrécir comme une opération unique tant que vous pouvez prendre soin de la fragmentation de votre index par la suite grâce à la reconstruction leur. L'opération de rétrécissement peut prendre du temps, vous devez donc la planifier pour un moment où vous pouvez payer le prix d'une opération de rétrécissement. L'approche consistant à créer une base de données vide et à y copier des données fonctionne - mais cela peut devenir très difficile avec des bases de données plus grandes et beaucoup de données.

Si vous prévoyez d'ajouter cet espace à la base de données par le biais d'une utilisation normale et de modèles de croissance dans le futur, vous souhaiterez peut-être simplement y laisser cet espace.

Également Vous avez dit avoir "effacé" votre journal des transactions. Je serais curieux de savoir comment vous avez fait cela, mais en lisant le post que j'ai partagé et les autres de la série, vous verrez quelques conseils sur la gestion du journal des transactions. Mais en bref - si vous êtes en mode de récupération complète, vous devez effectuer des sauvegardes de journal régulières pour que le journal se réutilise. Sinon - sans sauvegarde de journal en mode complet - le fichier journal ne cesse de croître et de plus en plus et enregistre toujours ce que vous avez fait parce que vous avez dit à SQL que vous ne voulez pas simplement conserver ce journal pour la récupération après incident, mais que vous souhaitez conserver un sauvegarde manuelle de celui-ci pour relire les transactions / annuler les transactions pour récupérer à un moment précis à des fins de récupération ... Si vous êtes simple et que le journal augmente excessivement,BEGIN TRAN ... do work.... COMMIT TRANou si vous venez d'émettre une grosse DELETEdéclaration et de supprimer tout un tas de données en une seule transaction implicite.)

Je suppose également que vous recherchez cet espace libre sur votre système de fichiers. Si vous le recherchez dans SQL et dans ce gros fichier que vous avez - il se peut que vous attendiez le nettoyage du fantôme pour terminer si vous recherchez immédiatement après votre opération. Paul Randal blogue sur Ghost Cleanup .

Mike Walsh
la source
9

La suppression de lignes dans une base de données ne réduira pas la taille réelle du fichier de base de données.

Vous devez compacter la base de données après la suppression des lignes.

SQL Server 2005 DBCC SHRINKDATABASE (Transact-SQL)

Après avoir exécuté cela, vous voudrez reconstruire les index. Le rétrécissement entraîne généralement une fragmentation de l'index, ce qui peut représenter un coût de performance important.

Je recommanderais également qu'après avoir réduit, vous re-développiez les fichiers afin d'avoir de l'espace libre. De cette façon, lorsque de nouvelles lignes arrivent, elles ne déclenchent pas la croissance automatique. La croissance automatique a un coût de performance et est quelque chose que vous souhaitez éviter (grâce à un dimensionnement approprié de la base de données) dans la mesure du possible.

John Siu
la source
4

NE RÉTRÉCIEZ PAS VOTRE BASE DE DONNÉES!

"Pourquoi cela se produit-il? Une opération de réduction de fichier de données fonctionne sur un seul fichier à la fois et utilise les bitmaps GAM (voir À l'intérieur du moteur de stockage: GAM, SGAM, PFS et autres mappages d'allocation) pour trouver la page la plus élevée allouée dans le fichier. Il le déplace ensuite aussi loin que possible vers l'avant du fichier, et ainsi de suite. Dans le cas ci-dessus, il a complètement inversé l'ordre de l'index clusterisé, le faisant passer de parfaitement défragmenté à parfaitement fragmenté. "

http://www.sqlskills.com/BLOGS/PAUL/post/Why-you-should-not-shrink-your-data-files.aspx

"Regardez l'ironie de la base de données Shrinking. Une personne réduit la base de données pour gagner de l'espace (pensant que cela aidera les performances), ce qui conduit à une augmentation de la fragmentation (réduction des performances). Pour réduire la fragmentation, on reconstruit l'index, ce qui conduit à la taille de la base de données pour augmenter bien plus que la taille d'origine de la base de données (avant de rétrécir). Eh bien, en rétrécissant, on n'a pas gagné ce qu'il cherchait habituellement. "

http://blog.sqlauthority.com/2011/01/19/sql-server-shrinking-database-is-bad-increases-fragmentation-reduces-performance/

Jimbo
la source
1
Vous devez déplacer les données vers un nouveau groupe de fichiers, puis supprimer l'ancien groupe de fichiers. De cette façon, vous n'obtenez aucune fragmentation et pouvez réduire votre base de données.
Ali Razeghi
2

Lorsque vous supprimez des données, SQL Server réserve son espace pour une utilisation ultérieure pour l'insertion de nouvelles données. Vous devez réduire la base de données. Vous pouvez trouver plus d'informations ici .

Amrinder Singh
la source
1

J'ai trouvé cela parce que je viens de supprimer un tas de tables de sauvegarde parce que ma base de données avait "atteint son maximum". J'ai continué à regarder la propriété "Size", me demandant pourquoi cela ne diminuait pas? . Après avoir lu ceci, non, je ne veux pas réduire la base de données. Ce que je veux faire, c'est "récupérer" l'espace pour les déchets que je viens de supprimer. Ce que je devais regarder, c'était "Espace disponible". Je pense que c'est peut-être aussi ce que quelqu'un d'autre devrait avoir besoin de regarder.? *

Josetta Caudill
la source
0

Il convient également de noter que si la table contient des index, une fragmentation peut exister après la suppression de vastes étendues de données. J'avais une table aujourd'hui qui avait environ 70 millions d'enregistrements, ce qui prenait environ 13 Go. Je l'ai nettoyé à 1639 enregistrements (le reste a été généré par un seul bug) mais la table a toujours pris environ 4,5 Go. Après avoir reconstruit tous les index de la table, cela ne prenait que 85 pages (680 Ko). Après cela, j'ai utilisé un fichier rétractable incrémentiel pour récupérer l'espace (et corrigé le bogue sur le système pour éviter une répétition).

G.Smith
la source