Grimpi IT Blog

mayo 9, 2008

Vardecimal

Filed under: Engine, SQL Server — grimpi @ 7:27 pm

A partir de SQL Server Service Pack 2, se incorpora un nuevo tipo de almacenamiento para los campos decimales, llamado vardecimal. Que es el vardecimal?
Bueno, actualmente los tipos de dato numeric o decimal son de longitud fija. Si declaramos un NUMERIC(38,0), el espacio físico en disco que va a ocupar dicho campo es de 17 bytes, sin importar el valor que tengamos almacenado.
Este es el tamaño que ocupan los tipos de datos numeric/decimal según su precisión:
Precision   Storage (Bytes)
1 to 9                5
10 to 19             9
20 to 28           13
29 to 38           17

El vardecimal lo que haría entonces es transformar los tipos de datos numeric/decimal de longitud fija a longitud variable en función del valor que tenemos almacenado en dicho campo, interesante no?.
Se podría decir que a muy alto nivel, el vardecimal es al decimal y numeric, lo que el varchar es el char.
La ventaja de este nuevo tipo de almacenamiento es obviamente el ahorro de espacio en disco y tener registros más chicos, lo que podría impactar en forma beneficiosa en una reducción de operaciones de I/O, haciendo más rápidas las lecturas.
Sin embargo es importante aclarar, que a diferencia de char/varchar, el vardecimal no es un nuevo tipo de dato, sino un atributo de la tabla, por lo tanto y esto es una limitación, en una tabla con varios campos numeric/decimal, o todas las columnas son de longitud fija o todas son de longitud variable.
Esta característica también se mantiene en SQL Server 2008 CTP6.

Bueno, como hacemos para usar el vardecimal?
En primer lugar, debemos habilitar a la base para que permita este tipo de operaciones, para eso ejecutamos esta instrucción:

exec sp_db_vardecimal_storage_format ‘DATABASE_NAME’, ‘ON’

Esto lo único que hace es habilitar el uso del vardecimal y cambiar la versión de la base de datos, para evitar que se atache la base a un servidor cuya versión sea inferior a SQL Server 2005 Service Pack 2.
Luego, habilitamos a las tablas que queremos, para que usen vardecimal, para eso, hay que ejecutar la siguiente instrucción:

exec sp_tableoption ‘NOMBRE DE LA TABLA’, ‘vardecimal storage format’,‘on’

Al ejecutar esta instrucción, todas las columnas numeric se transformaran en longitud variable. Por lo tanto, si nuestra tabla tiene millones de registros, esta operación puede llegar a durar un buen tiempo y un aspecto importante es que bloquea toda la tabla y los índices con este tipo de campos, para cualquier tipo de operación, por lo cual, por lo cual, hay que ejecutar esta operación en un horario donde no tenga impacto.
También podemos ejecutar la operación inversa, o sea, transformar todas las columnas numeric de longitud variable, en longitud fija. Para eso, hay que ejecutar el mismo SP, pero con el valor off.

exec sp_tableoption ‘NOMBRE DE LA TABLA’, ‘vardecimal storage format’,‘off’

Ahora bien, antes de ir corriendo a nuestro servidor para habilitar esta fantástica nueva feature del SQL 2005 SP2, tenemos que pensar si realmente nos trae un beneficio el uso del vardecimal. Por ejemplo, si tenemos una tabla con una columna cuyo tipo de dato sea NUMERIC(15,0) y la mayoría de los valores de esta columna tengan entre 12 y 15 dígitos, el ahorro de espacio que vamos a tener seria mínimo. Ahora, si la dispersión en el tamaño de los valores es importante, entonces conveniente evaluar el uso del vardecimal.
Para tener una aproximación del ahorro que ganaríamos habilitando este nuevo tipo de formato, SQL nos provee el siguiente SP, que calcula la potencial reducción de espacio en una tabla:

exec sys.sp_estimated_rowsize_reduction_for_vardecimal ‘NOMBRE DE LA TABLA’

Consideraciones y restricciones a tener en cuenta:
1) Como dijimos antes, el uso del vardecimal solo esta disponible a partir del Service Pack 2 Enterprise Edition y Developer Edition.
2) Si se habilita el vardecimal, el backup de la base no podrá ser restoreado en un servidor SQL Server 2005 que no sea SP2.
3) Como ya deberían saber, en SQL Server el tamaño de un registro no puede superar los 8060 bytes (aunque en determinadas situaciones hay una opción para superar este limite).
Por lo tanto, si tenemos un vardecimal cuyo valor máximo podría potencialmente exceder los 8060, SQL Server no permitirá la habilitación del vardecimal en dicha tabla.

Links:
http://msdn.microsoft.com/en-us/library/bb508963.aspx

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: