Comment réduire la taille de la table SQL Server qui a grandi à partir d'un changement de type de données
J'ai une table dans SQL Server 2005 qui était sur une taille de 4 go.
(environ 17 millions d'enregistrements)
J'ai changé un des champs de type char(30)
à char(60)
(il y a au total 25 champs dont la plupart sont char(10)
de sorte que le montant de char de l'espace s'ajoute aux quelque 300)
Cela a provoqué la table de doubler de taille (plus de 9 go)
J'ai ensuite changé le char(60)
à varchar(60)
, puis a couru une fonction pour couper les espaces superflus de données (de manière à réduire la durée moyenne des données dans le champ, à environ 15)
Ce n'est pas de réduire la taille de la table. Rétrécissement de la base de données n'a pas aidé non plus.
Court de recréer la structure de la table et de la copie de données (c'est 17 millions de disques!) est-il moins drastique de la façon d'obtenir la taille vers le bas encore?
- Exactement comment avez-vous réduire la base de données?
- dans management studio. Tâches->Shrink->Fichiers->Libérer l'espace inutilisé
Vous devez vous connecter pour publier un commentaire.
Eh bien, il est clair que vous êtes de ne pas obtenir de l'espace de retour ! 🙂
Lorsque vous avez modifié vos champs de texte à CHAR(60), ils sont tous remplis jusqu'à la capacité par des espaces. TOUS les champs sont maintenant vraiment de 60 caractères.
Changer le dos à VARCHAR(60) ne va pas aider - les champs sont toujours tous les 60 caractères de long....
Ce que vous avez vraiment besoin de faire est d'exécuter une fonction TRIM sur tous vos champs pour réduire les ramener à leur garnis de la longueur, puis faire une base de la réduction.
Après vous avez fait cela, vous devez RECONSTRUIRE les index cluster afin de récupérer une partie de cet espace perdu. L'index cluster est vraiment l'endroit où vos données de la vie - vous pouvez reconstruire comme ceci:
Par défaut, votre clé primaire est votre index cluster (sauf si vous avez spécifié autrement).
Marc
Vous n'avez pas nettoyé ou compactée toutes les données, même avec un "rétrécissement de la base de données".
DBCC CLEANTABLE
Cependant, un simple reconstruction d'index si il existe un index cluster devrait également faire
Un exemple de Tony Rogerson
Je sais que je ne suis pas répondre à votre question que vous posez, mais avez-vous considéré l'archivage des données à un tableau de l'historique, et de travailler avec le moins de lignes?
La plupart du temps, vous pourriez penser au premier coup d'œil que vous avez besoin de toutes les données de tous les temps, mais quand en fait assis, et en l'examinant, il y a des cas où ce n'est pas vrai. Ou au moins que j'ai vécu cette situation auparavant.
J'ai eu un problème similaire ici SQL Server, Conversion NTEXT de type NVARCHAR(MAX) qui a été liée à l'évolution de la ntext de type nvarchar(max).
J'ai dû faire une
UPDATE MyTable SET MyValue = MyValue
afin de l'obtenir pour redimensionner tous bien.De toute évidence, cela prend un temps assez long avec beaucoup d'enregistrements. Il y avait un certain nombre de suggestions quant à la manière de mieux à faire. Ils clé temporaire du drapeau indique si il avait été fait ou pas, puis la mise à jour de quelques milliers à la fois en boucle jusqu'à ce qu'il ait été fait. Cela voulait dire que j'avais "un peu" de contrôle sur la façon dont beaucoup qu'elle faisait.
Sur une autre note, si vous voulez vraiment réduire la base de données autant que possible, il peut aider si vous tournez le modèle de récupération vers le bas pour simple, de réduire la transaction de journaux, de réorganiser toutes les données dans les pages, puis revenez au modèle de récupération complète. Attention tout de même, le rétrécissement des bases de données est généralement pas conseillé, et si vous réduisez le modèle de récupération d'une base de données que vous demandez quelque chose à aller mal.
Alternativement, vous pourriez faire un tableau complet de reconstruction pour s'assurer il n'y a pas de données supplémentaires traîner n'importe où:
Bien sûr, les choses se compliquent avec l'identité, index, etc etc...