Come ridurre le dimensioni della tabella di SQL Server cresciute da una modifica del tipo di dati

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

Domanda

Ho una tabella su SQL Server 2005 che aveva una dimensione di circa 4 GB.

(circa 17 milioni di record)

Ho cambiato uno dei campi da tipo di dati char (30) a char (60) (ci sono in totale 25 campi la maggior parte dei quali sono char ( 10) quindi la quantità di spazio per i caratteri aumenta fino a circa 300)

Ciò ha comportato il raddoppio delle dimensioni della tabella (oltre 9 GB)

Ho quindi modificato il char (60) in varchar (60) e quindi ho eseguito una funzione per tagliare spazi bianchi extra dai dati (in modo da ridurre la media lunghezza dei dati nel campo a circa 15)

Ciò non ha ridotto le dimensioni della tabella. Anche la riduzione del database non ha aiutato.

A meno di ricreare effettivamente la struttura della tabella e copiarne i dati (sono 17 milioni di record!) c'è un modo meno drastico di ridimensionare nuovamente le dimensioni?

È stato utile?

Soluzione

Beh, è ??chiaro che non stai recuperando spazio! : -)

Quando hai modificato i tuoi campi di testo in CHAR (60), vengono riempiti tutti con capacità con spazi. Quindi TUTTI i tuoi campi ora hanno una lunghezza di 60 caratteri.

Cambiarlo in VARCHAR (60) non sarà d'aiuto - i campi sono ancora lunghi tutti e 60 i caratteri ....

Quello che devi davvero fare è eseguire una funzione TRIM su tutti i tuoi campi per ridurli alla loro lunghezza ridotta e quindi ridurre il database.

Dopo averlo fatto, è necessario RICOSTRUIRE l'indice cluster per recuperare parte dello spazio sprecato. L'indice cluster è davvero il luogo in cui vivono i tuoi dati: puoi ricostruirlo in questo modo:

ALTER INDEX IndexName ON YourTable REBUILD 

Per impostazione predefinita, la chiave primaria è l'indice cluster (se non diversamente specificato).

Marc

Altri suggerimenti

Non hai pulito o compattato alcun dato, anche con un database "riduci" "

DBCC CLEANTABLE

  

Recupera lo spazio dalle colonne a lunghezza variabile rilasciate in tabelle o viste indicizzate.

Tuttavia, un semplice ricostruzione dell'indice < em> se esiste un indice cluster dovrebbe farlo anche

ALTER INDEX ALL ON dbo.Mytable REBUILD

Un esempio funzionante di Tony Rogerson

So che non sto rispondendo alla tua domanda mentre stai chiedendo, ma hai preso in considerazione l'archiviazione di alcuni dei dati in una tabella di cronologia e lavori con meno righe?

La maggior parte delle volte potresti pensare a prima vista che hai sempre bisogno di tutti quei dati, ma quando in realtà ti siedi e li esamini, ci sono casi in cui ciò non è vero. O almeno ho sperimentato quella situazione prima.

Ho avuto un problema simile qui SQL Server, conversione da NTEXT a NVARCHAR (MAX) che era correlato alla modifica di ntext in nvarchar (max).

Ho dovuto fare un UPDATE MyTable SET MyValue = MyValue per farlo ridimensionare bene.

Questo ovviamente richiede parecchio tempo con molti dischi. C'erano una serie di suggerimenti su come farlo meglio. La chiave è stata una bandiera temporanea indicata se era stata eseguita o meno e quindi l'aggiornamento di alcune migliaia alla volta in un ciclo fino a quando non è stato fatto tutto. Ciò significava che avevo " alcuni " controllo su quanto stava facendo.

In un'altra nota, tuttavia, se si desidera veramente ridurre il più possibile il database, può essere utile se si trasforma il modello di recupero in semplice, si riducono i registri delle transazioni, si riorganizzano tutti i dati nelle pagine, quindi si imposta torna al modello di recupero completo. Fai attenzione, in genere non è consigliabile ridurre i database e, se riduci il modello di recupero di un database live, chiedi che qualcosa vada storto.

In alternativa, puoi fare una ricostruzione completa della tabella per assicurarti che non ci siano dati aggiuntivi in ??giro ovunque:

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

Naturalmente, le cose si complicano con identità, indici, ecc. ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top