¿Cómo podemos averiguar el tamaño de una base de datos (o de sus tablas, archivos, etc...) desde código?
Si utilizamos SQL Server Management Studio (SSMS) es una tarea muy sencilla, pero desde código se nos puede atragantar. En este vídeo de nuestro tutor José Manuel Alarcón aprenderás 3 formas diferentes de conseguirlo mediante consultas, aparte de la básica mencionada:
Ver el tamaño en SQL Server Management Studio
Esta forma es muy sencilla, simplemente podemos consultar el tamaño haciendo clic derecho en nuestra base de datos y pulsando en "propiedades":
Una vez aquí, también podemos hacer clic en "Files" y ver cuánto pesa cada uno de los archivos que componen la base de datos:
Código: Método 1 - Procedimiento almacenado sp_spaceused
Este primer método consiste en usar el procedimiento almacenado sp_spaceused
y para usarlo debes estar en la base de datos que te interesa. En una aplicación primero abres una conexión a esa BBDD por lo que ya estarás en ella, pero en el SSMS necesitas elegirla o poner USE
.
Si lo ejecutamos en SQL Server Management Studio:
USE Dashcommerce
EXEC sp_spaceused
Vemos que nos devuelve dos grupos de resultados o resultsets:
En el primero viene su nombre, tamaño y el espacio sin utilizar de la propia bbdd, y en el segundo nos desglosa la información en: espacio reservado, espacio ocupado por datos, espacio ocupado por los índices y espacio sin utilizar.
Esto también lo podríamos hacer para ver el tamaño de una tabla concreta de nuestra base de datos, simplemente añadiendo su nombre como un argumento de texto, por ejemplo:
EXEC sp_spaceused '[dbo].[dashCommerce_Store_Order]'
Peor también podríamos hacerlo con todas las tablas. Para ello podemos usar el procedimiento almacenado del sistema sp_msforeachtable
que ejecuta un comando para cada tabla de la bbdd actual:
EXEC sp_msforeachtable 'EXEC sp_spaceused [?]'
El [?]
se sustituirá por el nombre de cada tabla, (necesitamos los corchetes por si los nombres de las tablas tienen espacios o caracteres especiales).
Al final nos devolverá un resultset por cada tabla:
Código: Método 2 - Procedimiento almacenado sp_helpdb
El segundo método se basa en otro procedimiento almacenado: sp_helpdb
EXEC sp_helpdb
Este procedimiento nos devuelve un listado con todas las bases de datos del sistema junto con: su nombre, tamaño, dueño, id, fecha de creación, estatus y nivel de compatibilidad de las consultas:
De nuevo, si queremos ver una en concreto, se le pasa como argumento el nombre de la base de datos de SQL Server:
EXEC sp_helpdb 'DashCommerce'
Y en este caso veremos que nos devuelve dos datasets: uno con los mismos datos del listado anterior y otro desglosando la información de cada unos de los archivos que la componen: rutas, tipo de archivo, tamaño, tamaño máximo, método de crecimiento y tipo de uso de los archivos.
Código: Método 3 - Vista sys.database_files
Finalmente, el tercer método. En este caso se trata de usar la vista del sistema sys.database_files:
Si ejecutamos esta consulta:
SELECT * FROM sys.database_files
Vemos que nos devuelve muchísima información de cada uno de los archivos de la base de datos:
Como en este caso solo nos interesa el tamaño, vamos a indicar qué datos concretos queremos:
SELECT name, size, max_size
FROM sys.database_files
Pero los datos de tamaño que nos devuelve no nos dan un dato coherente con los de anteriores métodos 🤔:
¿Por qué? ¿Qué nos está queriendo indicar en size
?
Importante: El problema aquí es que el tamaño nos lo está devolviendo expresado en número de páginas de 8KB de tamaño. Así que vamos a tener que hacer un pequeño cálculo para convertir este valor en un dato útil.
Lo que vamos a hacer es multiplicar este tamaño por 8 (son páginas de 8KB) y dividirlo entre 1024 para que nos devuelva el tamaño en MB:
SELECT name, size*8/1024 AS TamMB, max_size
FROM sys.database_files
Además hemos renombrado el campo como TamMB
, porque lo que vamos a obtener es el tamaño en MB:
Por cierto, hay una vista muy parecida llamada sys.master_files
que devuelve lo mismo, pero necesita más permisos, por lo que de entrada te recomendamos usar sys.database_files
.
Todavía existen más maneras de averiguar esta información (SQL Server es un pozo sin fondo de posibilidades de hacer las cosas), pero estos tres son los métodos más comunes.