SQL Server alter table para cambiar TEXT a NVARCHAR (MAX) aumentando considerablemente el tamaño de la base de datos

8

Necesito actualizar una base de datos de SQL Server que tenga aproximadamente 18 GB de tamaño para cambiar un número significativo de TEXTcolumnas NVARCHAR(MAX).

El problema que tengo es que después de ejecutar todos los alter tablecomandos, la base de datos termina teniendo un tamaño de casi 26 GB. Entiendo que a partir de aquí el uso NVARCHAR(MAX)permitirá que el DB crezca más lentamente, pero ¿hay alguna forma de evitar esta hinchazón?

Aidan Lawless
fuente
2
Oh, no crees la misma pregunta aquí. Solo márquelo en SO y las modificaciones lo migrarán aquí en un instante :-). Ahora alguien necesita fusionar / limpiar ... etc.
Marian
2
¿La base de datos es más grande o el registro es muy grande?
Aaron Bertrand
Lo siento Marian, entiendo ahora ...
Aidan Lawless
Aaron, el archivo MDF es mucho más grande ... casi 10 GB más grande
Aidan Lawless

Respuestas:

7

Espero que esta publicación te sea de ayuda.

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

Hechos clave:

  • Por defecto, TEXT y NTEXT almacenan el valor del texto en la estructura LOB
  • Por defecto, NVARCHAR (MAX) almacena el valor de texto en la estructura de la tabla (a menos que sea superior a 8000 bytes)
  • Cuando modifica la columna de TEXT / NTEXT a NVARCHAR (MAX), la forma en que se almacenan los datos no cambia, solo actualiza los metadatos de la tabla. La estructura de datos solo cambia la próxima vez que se cambia el valor. Esto se puede hacer inmediatamente ejecutando algo como esto:

      update mytable set mycolumn1 = mycolumn1
  • Si utiliza la configuración de opción de tabla predeterminada para NVARCHAR (MAX), los datos en su tabla serán más grandes.

    - Tendrá que mirar la configuración de opciones de la mesa y el entorno antes de cambiar la configuración según sus necesidades.

  • El tamaño de su tabla eventualmente se reducirá si sigue su declaración de alterar tabla con la instrucción de actualización de tabla.

En resumen, si ejecuta la declaración de actualización, obligando a cambiar el almacenamiento de la estructura de datos, el tamaño de su base de datos será menor, como se esperaba.

EDITAR : Como ha mencionado TEXTO y no NTEXT, su ganancia en el espacio sería menos obvia de lo que podría pensar. NTEXT ocupa el doble de espacio que TEXT, pero al mismo tiempo, debe esperar que NVARCHAR (MAX) ocupe aproximadamente la mitad del espacio que NTEXT. Según mis cálculos, vería pocos cambios con respecto al tamaño original de su base de datos.


Crédito especial a http://www.douglubey.com/

RoKa
fuente
2
¿Podría resumir aquí los hechos importantes, en caso de que el enlace se vuelva inactivo?
Stephane Rolland
Como se mencionó en otras respuestas, TEXT vs. NTEXT tendrá un impacto en el almacenamiento, pero no tanto como usted ha sugerido.
RoKa
Gracias ... He estado posponiendo unirse por años ... Me alegro de estar aquí.
RoKa
Gracias RoKA, eso ha marcado una diferencia significativa en algunas de las tablas en cuestión. Voy a restaurar la base de datos nuevamente y lo haré gradualmente para ver los efectos. Gracias de nuevo .....
Aidan Lawless
Es un placer.
RoKa
6

Puede ser un descuido en su pregunta, pero está diciendo TEXTO a NVARCHAR (máx.) Y no NTEXT a NVARCHAR (máx.). Si esto es lo que realmente está haciendo, está cambiando de ANSI a UNICODE y no debería sorprenderse de que tome más espacio (caracteres de un solo byte versus caracteres de varios bytes).

spaghettidba
fuente
Sí, eso es lo que estoy haciendo ... aunque basado en algunos cálculos simples, no tendría en cuenta el tamaño del aumento.
Aidan Lawless
2
¿Has probado con la sugerencia de RoKa?
spaghettidba
1
@AidanLawless ¿qué cálculos son estos? El tamaño de la base de datos debe aumentar al menos en el tamaño del TEXTcampo existente ; ir a Unicode ocupa exactamente el doble del espacio de almacenamiento de ANSI.
JNK
2
@JNK ... a menos que use compresión en 2008 R2 o superior, donde la compresión Unicode tratará los caracteres ASCII almacenados en NVARCHAR como VARCHAR.
Aaron Bertrand