Comment réduire la taille d'une table SQL Server issue d'un changement de type de données

StackOverflow https://stackoverflow.com/questions/807579

Question

J'ai une table sur SQL Server 2005 d'une taille d'environ 4 Go.

(environ 17 millions d'enregistrements)

J'ai remplacé l'un des champs du type de données char (30) par char (60) (il y a au total 25 champs dont la plupart sont char ( 10) , la quantité d’espace de caractères s’élève donc à environ 300)

La taille de la table a doublé (plus de 9 Go)

J’ai ensuite changé le char (60) en varchar (60) , puis j’ai exécuté une fonction permettant de réduire l’espace supplémentaire dans les données (afin de réduire la moyenne longueur des données dans le champ à environ 15)

Cela n'a pas réduit la taille de la table. Réduire la base de données n’a pas aidé non plus.

À moins de recréer la structure de la table et de copier les données (ce qui représente 17 millions d’enregistrements!), existe-t-il un moyen moins radical de réduire la taille?

Était-ce utile?

La solution

Eh bien, il est clair que vous ne récupérez pas d’espace! : -)

Lorsque vous modifiez vos champs de texte en CHAR (60), ils sont tous remplis à pleine capacité avec des espaces. Donc, TOUS vos champs contiennent maintenant réellement 60 caractères.

Le fait de revenir à VARCHAR (60) ne changera rien - les champs ont toujours une longueur de 60 caractères ....

Ce que vous devez vraiment faire, c'est exécuter une fonction TRIM sur tous vos champs pour les ramener à leur longueur ajustée, puis réduire la taille de la base de données.

Après cela, vous devez RECONSTRUIRE votre index clusterisé afin de récupérer une partie de cet espace perdu. L’index clusterisé est vraiment l’endroit où résident vos données - vous pouvez le reconstruire comme suit:

ALTER INDEX IndexName ON YourTable REBUILD 

Par défaut, votre clé primaire est votre index clusterisé (sauf indication contraire de votre part).

Marc

Autres conseils

Vous n'avez nettoyé ni compacté aucune donnée, même avec une "base de données réduite".

DBCC CLEANTABLE

  

Récupère de l'espace à partir de colonnes de longueur variable supprimées dans des tables ou des vues indexées.

Cependant, une reconstruction d'index simple < em> s'il existe un index clusterisé devrait également le faire

ALTER INDEX ALL ON dbo.Mytable REBUILD

Un exemple concret de Tony Rogerson

Je sais que je ne réponds pas à la question que vous posez, mais avez-vous envisagé d'archiver certaines données dans une table d'historique et utilisez-vous moins de lignes?

La plupart du temps, vous pensez peut-être à première vue que vous avez besoin de toutes ces données tout le temps, mais lorsque vous vous asseyez vraiment pour les examiner, il existe des cas où ce n'est pas vrai. Ou du moins j'ai déjà vécu cette situation.

Vous pouvez également procéder à une reconstruction complète de la table pour vous assurer qu'aucune donnée supplémentaire ne traîne nulle part:

CREATE TABLE tmp_table(<column definitions>);
GO
INSERT INTO tmp_table(<columns>) SELECT <columns> FROM <table>;
GO
DROP TABLE <table>;
GO
EXEC sp_rename N'tmp_table', N'<table>';
GO

Bien sûr, les choses se compliquent d'identité, d'index, etc. etc.

scroll top