martes, 22 de febrero de 2011

Cómo se almacenan los datos en SQL Server?. Calculando el tamaño de una Tabla

Al crear una base de datos, es importante comprender cómo SQL Server almacena los datos para poder calcular y especificar la cantidad de espacio en disco que hay que asignar a los archivos de datos y registros de transacciones. 

Todas las bases de datos tienen un archivo de datos principal (.mdf), y uno o varios archivos de registro de transacciones (.ldf). Una base de datos también puede tener archivos de datos secundarios (.ndf). Estos archivos físicos tienen nombres del sistema operativo y nombres de archivo lógicos que se pueden utilizar en instrucciones Transact-SQL. La ubicación predeterminada para todos los archivos de datos y registros de transacciones es C:\Archivos de programa\Microsoft SQL Server\MSSQL\Data. 

Los datos se almacenan en bloques de 8 kilobytes (KB) de espacio contiguo en disco, llamados páginas. Esto significa que una base de datos puede almacenar 128 páginas por megabyte (MB )

Las filas no pueden abarcar más de una página. Por tanto, la máxima cantidad de datos de una fila, quitando el espacio necesario para la cabecera de la fila, es 8060 bytes.

Las tablas y los índices se almacenan en extensiones. Una extensión son ocho páginas contiguas, o 64 KB. Por tanto, una base de datos tiene 16 extensiones por megabyte. Las tablas pequeñas pueden compartir extensiones con otros objetos de la base de datos

Procedimientos Importantes:
sp_helpdb baseDeDatos

Informa sólo acerca de la base de datos especificada. Proporciona el nombre, el tamaño, el propietario, el Id., la fecha de creación y las opciones de la base de datos. También enumera los archivos de datos y de registro

sp_spaceused [nombreObjeto]
    Resume el espacio de almacenamiento que utiliza una base de datos o un objeto de base de datos   

 
    Estimación de la cantidad de datos en las tablas


Puede calcular el número de páginas necesarias para una tabla y el espacio de disco que ocupa la tabla si conoce el número de caracteres de cada fila y el número aproximado de filas que la tabla va a tener. 

Utilice el siguiente método:
·         Calcule el número de bytes de una fila sumando el número de bytes que contiene cada columna. Si una o varias columnas están definidas con longitud variable (por ejemplo, una columna de nombres), puede sumar el valor medio de la columna para hallar el total. 

·         Determine el número de filas que caben en cada página de datos. Para hacerlo, divida 8060 entre el número de bytes de una fila. Redondee hacia abajo el resultado al número entero siguiente. 

·         Divida el número aproximado de filas de la tabla por el número de filas que caben en cada página de datos. El resultado es igual al número de páginas que se necesitan para almacenar la tabla. 

Nota: Una fila no puede ser mayor que una página

Ejemplo:  Tabla Orders base Northwind:
Cantidad de Byte por Fila :  210 BYTE
Cantidad de Byte por Página: 8060 BYTE
Cantidad de Filas por Página: 38.38
Cantiad de Filas en la Tabla: 830
Cantidad de Paginas Utilizadas: 21.625
KB en la Tabla 21.625 * 8  =   173 KB
En el procedimiento sp_spaceused 'orders'  nos da un total de :  160 KB
Por lo cual esta correcto debido a los valores de longitud variable no se utilizan 100% tendríamos en nuestro calculo 13KB de mas considerando un promedio de uso en los valores varchar.

4 comentarios:

  1. Buen Artículo, me ha interesado mucho pues tengo muchas dudas al respecto, por estos días necesito saber para pedir el servicio de base de datos, las dimensiones y la verdad no se como hacerlo, existe algún procedimiento matemático que pueda relacionar la cantidad cantidad de registros, con la cantidad de campos, y el largo de cada campo y me entregue un valor aproximado de las dimensiones de la base de datos disculpa mi ignorancia pero si me puedes ayudar te lo agradeceré atte (ingelinf@gmail.com)

    ResponderEliminar
  2. por qué no contestó mi pregunta?

    ResponderEliminar
  3. yo tampoco contestaría a "anónimo"... para exigir una respuesta creo que lo minimo seria dar un nombre, y ni siquiera asi seria exigible, ya que esto es una colaboración.
    Ademas, la pregunta esta perfectamente respondida en el mismo articulo, si se lee BIEN te estan dando un procedimiento matematico

    ResponderEliminar