SQL Server modifica la tabella per modificare TEXT in NVARCHAR (MAX) aumentando notevolmente le dimensioni del database


8

Devo aggiornare un database di SQL Server delle dimensioni di circa 18 GB per modificare un numero significativo di TEXTcolonne NVARCHAR(MAX).

Il problema che sto avendo è dopo aver eseguito tutti i alter tablecomandi che il database ha una dimensione di quasi 26 GB. Capisco che da qui l'utilizzo NVARCHAR(MAX)consentirà al DB di crescere più lentamente ma c'è un modo per me di prevenire questo gonfiore?


2
Oh, non creare la stessa domanda qui. Basta contrassegnarlo su SO e le mod lo migreranno qui in un istante :-). Ora qualcuno ha bisogno di unire / pulire..ecc.
Marian,

2
Il database è più grande o il registro è molto grande?
Aaron Bertrand

Scusa Marian, capisci ora ...
Aidan Lawless

Aaron, il file MDF è molto più grande .... quasi 10 GB più grande
Aidan Lawless

Risposte:


7

Mi aspetto che questo post ti sarà di aiuto.

http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx

Aspetti principali:

  • Per impostazione predefinita, TEXT e NTEXT memorizzano il valore del testo nella struttura LOB
  • Per impostazione predefinita, NVARCHAR (MAX) memorizza il valore di testo nella struttura della tabella (a meno che non sia superiore a 8000 byte)
  • Quando si modifica la colonna da TEXT / NTEXT a NVARCHAR (MAX), il modo in cui i dati vengono archiviati non viene modificato, ma aggiorna solo i metadati della tabella. La struttura dei dati viene modificata solo alla successiva modifica del valore. Questo può essere fatto immediatamente eseguendo qualcosa del genere:

      update mytable set mycolumn1 = mycolumn1
  • Se si utilizza l'impostazione dell'opzione di tabella predefinita per NVARCHAR (MAX), i dati nella tabella saranno più grandi.

    - Sarà necessario esaminare le impostazioni e l'ambiente delle opzioni della tabella prima di modificare l'impostazione in base alle proprie esigenze.

  • Le dimensioni della tabella si ridurranno eventualmente, se segui l'istruzione alter table con l'istruzione update table.

In breve, se si esegue l'istruzione update, forzando la modifica della memoria della struttura dei dati, le dimensioni del database saranno inferiori, come previsto.

EDIT : Come hai già detto TEXT e non NTEXT, il tuo guadagno nello spazio sarebbe meno ovvio di quanto potresti pensare. NTEXT occupa il doppio della quantità di spazio rispetto a TEXT, ma allo stesso tempo dovresti aspettarti che NVARCHAR (MAX) occupi circa la metà dello spazio rispetto a NTEXT. Secondo il mio calcolo, vedresti poche modifiche rispetto alle dimensioni del database originale.


Credito speciale a http://www.douglubey.com/


2
potresti riassumere qui i fatti importanti, nel caso in cui il link possa diventare morto.
Stephane Rolland,

Come menzionato in altre risposte, TEXT vs. NTEXT avranno un impatto sulla memoria, ma non di quanto tu abbia suggerito.
RoKa,

Grazie ... Mi sto rimandando da anni ormai ... Sono contento di essere qui.
RoKa

Grazie RoKA, ciò ha fatto una differenza significativa per un paio di tavoli in questione. Ho intenzione di ripristinare nuovamente il database e farlo in modo incrementale per vedere gli effetti. Grazie ancora .....
Aidan Lawless

Piacere mio.
RoKa

6

Potrebbe essere una svista nella tua domanda, ma stai dicendo TEXT a NVARCHAR (max) e non NTEXT a NVARCHAR (max). Se questo è ciò che stai realmente facendo, stai cambiando da ANSI a UNICODE e non dovresti essere sorpreso che occupi più spazio (caratteri a byte singolo rispetto a caratteri a byte multipli).


Sì, è quello che sto facendo ... sebbene sulla base di alcuni semplici calcoli non spiegherebbe la dimensione dell'aumento.
Aidan Lawless,

2
Hai provato con il suggerimento di RoKa?
spaghettidba,

1
@AidanLawless quali sono questi calcoli? La dimensione del database dovrebbe aumentare almeno della dimensione del TEXTcampo esistente : passare all'unicode richiede esattamente il doppio dello spazio di archiviazione di ANSI.
JNK,

2
@JNK ... a meno che non si usi la compressione nel 2008 R2 o superiore, in cui la compressione Unicode tratterà i caratteri ASCII memorizzati in NVARCHAR come VARCHAR.
Aaron Bertrand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.