Datos numéricos en SQL Server (Parte 2)

CONSIDERACIONES DE ALMACENAMIENTO EN EL USO DE ENTEROS
En la primera parte revisamos como se comportan ciertos tipos de datos. Pero los tipos de datos también definen cuanto bytes va a consumir en almacenamiento el dato que vamos a registrar. Es importante considerar esto por que impacta en el almacenamiento total de la base de datos, es decir, cuantos bytes, megas o gigas consumen los archivos de datos. Esta es la tabla de consumo de bytes de los tipos de datos numeric y decimal:
Precisión
Almacenamiento
1-9
5 bytes
10-19
9 bytes
20-28
13 bytes
29-38
17 bytes
Tabla 1
 
.
Analicemos la estructura de la tabla de prueba, observando la columna Lenght, que indica los bytes consumidos:
sp_help #PruebaTipoDato
image
 
Conforme a la tabla 1, nuestros datos de precisión 10 consumen 9 bytes. Esto quiere decir que para cada registro, las columnas n1, n2, n3 y n4 van a consumir 9 bytes cada una, es decir 36 bytes en total. Si multiplicamos estos valores por la cantidad de registro de la tabla vamos a tener el consumo total de bytes.
.
Pero si solo quiero almacenar enteros, debemos contemplar el uso de los tipos de datos bigint, int, smallint o tinyint, dependiendo del rango máximo de números. Esta es la tabla de consumo de bytes de los tipos de datos mencionados:
Tipo dato
Rango
Almacenamiento
tinyint
de 0 a 255
1 Byte
smallint
de -32,768  (-2^15  ) a 32,767 (2^15-1)
2 Bytes
int
de -2,147,483,648 (-2^31) a 2,147,483,647 (2^31-1 )
4 Bytes
bigint
de -9,223,372,036,854,775,808 (-2^63)
a 9,223,372,036,854,775,807 (2^63-1)
8 Bytes
Tabla 2
 
.
Observemos que el tipo de datos int también soporta 10 dígitos, pero solo consume 4 bytes, menos de la mitad que un decimal(10) o un numeric(10). Agreguemos una columna a nuestra tabla de prueba, con el tipo de dato int, y observemos nuevamente la columna lenght: 
ALTERTABLE #PruebaTipoDato
ADD n5 intnull
 
.
sp_help #PruebaTipoDato
image
 
.
Obsérvese lo siguiente:
  • La columna n5 con tipo de dato int tiene la misma precisión pero consume solo 4 bytes contra los 9 de los campos decimal y numeric.
  • Cuando utilizamos el tipo de dato int en la creación de la columna n5, no fue necesario indicar la precisión, solo se indica el tipo de dato. La cantidad y rango de dígitos enteros esta dado por los bytes que consume, de acuerdo a la tabla 2.
  • El símbolo “-“ para números negativos no se cuenta como dígito.
.
Pero hay que considerar un tema: a pesar de que el tipo de dato int tiene una precisión de 10, no soporta el mismo rango de números que decimal(10) o numeric(10). Veamos unos ejemplos:
INSERTINTO #PruebaTipoDato(Prueba, n1, n3, n5)
VALUES (‘Prueba 5 – int’, 9999999999, 9999999999, 9999999999)
 
.
Esta sentencia va a fallar, por que el rango máximo de la columna n5 es 2,147,483,647. El mensaje de error desplegado es el que sigue:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.
The statement has been terminated.
 
.
La sentencia correcta sería:
INSERTINTO #PruebaTipoDato(Prueba, n1, n3, n5)
VALUES (‘Prueba 6 – int’, 9999999999, 9999999999, 2147483647)
 
.
Consultemos los datos de la tabla:
SELECT Prueba, n1, n3, n5
FROM #PruebaTipoDato
WHERE Prueba =‘Prueba 6 – int’
image
 
.
Por lo tanto, aunque la precisión es la misma para int, decimal(10) y numeric (10), los rangos máximos de números no son los mismos.
.
CONSIDERACIONES DE ALMACENAMIENTO EN EL USO DE DECIMALES
.
Si lo que deseamos almacenar son números decimales, debemos contemplar el uso de money o smallmoney. Esta es la tabla de consumo de bytes de los tipos de datos mencionados:
Tipo dato
Rango
Almacenamiento
smallmoney
de -214,748.3648 a 214,748.3647
4 bytes
Money
de -922,337,203,685,477.5808 a 922,337,203,685,477.5807
8 bytes
Tabla 3
 
.
Agreguemos una columna a nuestra tabla de prueba, con el tipo de dato money, y observemos nuevamente la columna lenght:
ALTERTABLE #PruebaTipoDato
ADD n6 moneynull
 
.
sp_help #PruebaTipoDato
image
.
Obsérvese lo siguiente:
  • La columna n6 con tipo de dato money tiene mayor precisión y consume 8 bytes contra los 9 de los campos decimal y numeric. Tener en cuenta que la escala solo tiene 4 dígitos en vez de 5.
  • Cuando utilizamos el tipo de dato money en la creación de la columna n6, no fue necesario indicar la precisión, solo se indica el tipo de dato. La cantidad y rango de dígitos enteros y decimales esta dado por los bytes que consume, de acuerdo a la tabla 3.
  • El símbolo “-“ para números negativos no se cuenta como dígito.
.
CONCLUSIÓN: Es recomendable analizar adecuadamente el tipo de dato, para definir cuál es el más conveniente, no solo en función al dato que queremos almacenar, sino también a los bytes que vamos a consumir.

Un comentario en “Datos numéricos en SQL Server (Parte 2)

Deja un comentario

Tu dirección de correo electrónico no será publicada.