2011-02-15 17 views
6

Tengo una tabla con más de 300.000 registros, de un tamaño aproximado de 1,5 GBrecuperar el espacio no utilizado en SQL Server 2008

En esa mesa tengo tres varchar(5000) campos, el resto son pequeños campos.

Al emitir un update, estableciendo esos tres campos en ''.

Después de una contracción (base de datos y archivos) la base de datos utiliza casi el mismo espacio que antes ...

DBCC SHRINKDATABASE(N'DataBase') 
DBCC SHRINKFILE (N'DataBase' , 1757) 
DBCC SHRINKFILE (N'DataBase_log' , 344) 

Cualquier ideas sobre cómo recuperar ese espacio en disco?

Respuesta

3

Esencialmente, debe "mover" el contenido de la tabla de un lugar en el disco duro a otro. Cuando se lo mueve, SQL "volverá a empaquetar" el contenido de las páginas de manera eficiente. El solo hecho de reemplazar 5000 bytes de datos con 3 (o 0 y una máscara de bits nula volteada) no causará que SQL revise o reescriba el contenido de las páginas de la tabla.

Si la tabla tiene un índice agrupado, solo reindexarlo (ALTER INDEX ... REBUILD ...) hará el truco.

Si la tabla no tiene un índice agrupado, puede crear uno y luego soltarlo, o SELECCIONAR ... EN ... una nueva tabla, soltar la tabla anterior y cambiarle el nombre a la original nombre.

+0

Sí, el "mover el contenido" es la respuesta, cambiando el índice agrupado es un buen consejo, lo hice cambiando la estructura de la base de datos (el administrador sql crea una secuencia de comandos y vuelve a crear ...) – opensas

0

acabo de tener a establecer esos campos a null, emita el encogimiento, y luego se pone a ''

y el PP pasó de 1,5 GB a 115 MB

bastante extraño ...

-

, de hecho, el establecimiento de esos campos para contener nulos medios -Que recreando toda la mesa- hizo el truco

+0

No estoy seguro de si hace alguna diferencia aquí, pero ¿su tabla es un montón o tiene un índice agrupado? –

2

el hecho de que haya configurado la columna anular no significa que la base de datos reorganizará la tabla. El registro actualizado todavía se ajustará en la misma página en la que cabe antes (la cantidad de espacio libre en la página aumentará).

Además, usted sabe, ¿no es así, que varchar (5000) no quiere decir que ocupa 5000 octetos? Su longitud es variable: un prefijo de longitud de dos octetos que contiene la longitud de datos del campo, seguida de los octetos de datos. Establecer una columna varchar (5000) en una fila para 'foobar' requerirá 8 octetos de espacio (2 + 6).

Vuelva a generar sus índices, incluido el índice de agrupamiento.

Si no tiene un índice de agrupamiento, agregue uno. Eso forzará una reorganización de la mesa. Ahora suelte el índice de agrupamiento.

Ahora cuando reduce el tamaño del archivo de datos, debe recuperar algo de espacio en disco.

+0

Sí, sé que el varchar es variable ... es por eso que pensé que vaciar un campo varchar debería ser suficiente para disminuir el tamaño de la tabla ... – opensas