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:
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:
.
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:
.
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:
.
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.