determinar el tamaño de una tabla en SQL Server

Alguna vez se preguntó qué tan grande es realmente una tabla en la base de datos? Usted sabe que hay un millón de filas de la tabla, pero la cantidad de espacio que realmente tomar?

SQL Server proporciona un procedimiento almacenado integrado que puede ejecutar para mostrar fácilmente el tamaño de una mesa, incluyendo el tamaño de los índices … que podría sorprender.

Sintaxis

sp_spaceused ‘Tablename’

He aquí un ejemplo de él en acción

cosas de gran utilidad. Siempre es interesante ver que los índices son más grandes que los datos reales.

Si bien este es un comando útil para determinar el espacio asignado a una mesa, tenga en cuenta que las referencias sp_spaceused la tabla de sistema sysindexes para obtener los atributos espaciales y, a veces lo que está almacenado no puede llegar a estar fuera de sincronía con la realidad. Si ves los números espaciales que son aparentemente fuera de control (especialmente para el valor “sin usar”), ejecute un comando “DBCC UPDATEUSAGE” en contra de la tabla en cuestión antes de ejecutar sp_spacesued (o en contra de toda la base de datos si tiene tiempo y no está preocupado por pisar los pies de nadie).

Esta forma automática se puede realizar como un parámetro opcional dentro sp_spaceused …

p.ej. sp_spaceused ‘órdenes’, true

… O como comandos separados como se muestra a continuación.

Para actualizar las estadísticas de uso para toda la base de datos actual, la sintaxis es; DBCC UPDATEUSAGE (0)

Para una base de datos específica, llamada; DBCC UPDATEUSAGE ( ‘InsertdDbNameHere’)

Para una tabla específica; DBCC UPDATEUSAGE ( ‘InsertdDbNameHere’, ‘InsertdTableNameHere’)

Siempre puede comprobar BOL para todos los detalles acerca de DBCC UPDATEUSAGE

Gracias, utilizando analyer consulta y ejecutar procedimiento sp_spaceused es útil, sin embargo, lo que si su base de datos tiene cerca de 100 mesas demasiado. De todas formas para devolver todo el tamaño de la base de datos?

Acabo de encontrar este, devuelve spaceused para cada tabla

EXEC sp_MSforeachtable @ comando1 = “EXEC sp_spaceused ‘?'”

Charles sp_helpdb

Rick – que es uno de los comandos de SQL Server más útiles de todos los tiempos. Eres el mejor.

He intentado utilizar Ricks Tipp, pero que tiene 181 tablas en la base de datos aún no ha hago mucho bien. Además, su mecánico con la sp_spaceused tratada cada tabla como una consulta independiente, cosa que hizo imposible el uso de una estadística automatizada Crecimiento de Base de datos.

Robé / prestado la lógica de sp_spaceused y lo aplicó a la vista siguiente (wich añado ahora a una tabla de estadísticas, cosa que a continuación se puede consultar en varias formas)

SELECT; NombreTabla; NumRows; reservedpages * 8192/1024 como TotalSpace; páginas * 8192/1024 como espacio de datos; usedpages (páginas) * 8192/1024 como indexspace; (reservedpages-usedpages) * 8192/1024 como UnusedSpace

FROM (SELECT;. T [nombre] como nombre de tabla; avg ([filas]) como NumRows; sum (total_pages) como reservedpages; sum (used_pages) como usedpages; suma; CASE; Cuando it.internal_type EN (202204) A continuación, 0; cuando a.type 1 a.used_pages Entonces, cuando p.index_id

Bah, que se cortó, aquí está el resto

cuando p.index_id

cuando p.index_id

(Más pequeña que la muestra – por qué doesnt se necesita aquí?) 2 A continuación a.data_pages; Else 0; FIN) como páginas; de sys.allocation_units como un join sys.partitions como p = a.container_id en p.partition_id; izquierda se unen sys.internal_tables en p.object_id = it.object_id; ÚNETE sys.tables como t = t.object_id en p.object_id; -donde t.name = ‘mittra’; grupo por t [nombre]) como subselección.

Rick, Gracias compañero !!!!! Tan útil!

Rick, gracias!

im usando la base de datos TSQLFundamentals2008 y esta base de datos contiene el nombre de esquema de recursos humanos con los empleados de mesa en ella;. Probé el siguiente código da un error.

utilizar TSQLFundamentals2008; exec hr.employees sp_spaceused

-Error; Msg 102, nivel 15, estado 1, línea 2; sintaxis incorrecta cerca ‘.’.

He intentado utilizar el código sin nombre de esquema

utilizar TSQLFundamentals2008; exec empleados sp_spaceused

-Error; Msg 15009, nivel 16, estado 1, procedimiento sp_spaceused, línea 62; El objeto ’empleados’ no existe en la base de datos ‘TSQLFundamentals2008’ o no es válido para esta operación.

pls ayuda

Hey Nausif

Pruebe a ejecutar

sp_spaceused ” hr.employees

Lo anterior se ejecutará sin errores

Soy nuevo en SQL. Quiero tener una lista de todas las tablas y sus tamaños, por lo que veo cuál ha crecido de la mano. sp_spaceused significa que tengo que hacer eso de forma individual para los 70 cuadros. sp_helpdb muestra sólo la tabla completa

hey chicos tratan estos códigos .. Al igual que lo sp_spaceused hacer. sólo hay que ejecutar esta secuencia de comandos para su base de datos de destino.

DECLARE @table_name VARCHAR (500); declaramos @schema_name VARCHAR (500); DECLARE @ TABLA tab1; nombredetabla VARCHAR (500) cotejar database_default, SchemaName VARCHAR (500) cotejar database_default; CREATE TABLE #temp_Table; nombre_sist nombre de tabla, BIGINT row_count, reservado VARCHAR (50) cotejar database_default, los datos VARCHAR (50) cotejar database_default, index_size VARCHAR (50) cotejar database_default, sin usar VARCHAR (50) cotejar database_default; INSERT INTO @ tab1; SELECT Table_Name, TABLE_SCHEMA; DE INFORMATION_SCHEMA.TABLES; DONDE TABLE_TYPE = ‘BASE TABLA ‘; DECLARE CURSOR c1 PARA; SELECT TABLE_SCHEMA +’ ‘. + Table_Name; DE INFORMATION_SCHEMA.TABLES t1; DONDE TABLE_TYPE =’ Base de mesa ‘; ABIERTO c1; FETCH DESPUÉS de c1 EN @table_name, mientras que @@ FETCH_STATUS = 0; COMENZAR ; @table_name SET = SUSTITUIR (@table_name, “[“, “); @table_name SET = SUSTITUIR (@table_name, ‘]'”); – asegúrese de que el objeto existe antes de llamar sp_spaceused; SI eXISTE (SELECCIONAR ID desde sysobjects WHERE id = OBJECT_ID (@table_name)); COMENZAR; INSERT INTO #temp_Table EXEC sp_spaceused @table_name, falsa; END; FETCH DESPUÉS de c1 EN @table_name; END; c1 CERRAR; DESASIGNAR c1;. SELECT * t1, t2.schemaname; FROM t1 #temp_Table; INNER JOIN t2 @ tab1 ON (t1.tablename = t2.tablename); ORDER BY SchemaName, t1.tablename; DROP TABLE #temp_Table

Gracias Nitin funcionó …

hilo impresionante y consejos, gracias.

Aquí es el que tiene los nombres de esquema, así, =====================================

SELECT; SchemaName; NombreTabla; NumRows; reservedpages * 8192/1024 como TotalSpace; páginas * 8192/1024 como espacio de datos; usedpages (páginas) * 8192/1024 como indexspace; (reservedpages-usedpages) * 8192/1024 como UnusedSpace; FROM ( SELECT;. s [nombre] como SchemaName;. t [nombre] como nombre de tabla; avg ([filas]) como NumRows; sum (total_pages) como reservedpages; sum (used_pages) como usedpages; suma; CASE; Cuando it.internal_type EN (202204) a continuación, 0; Cuando a.type = 1 Entonces a.used_pages; Cuando p.index_id <2 a continuación a.data_pages; Else 0; FIN) como páginas; de sys.allocation_units como Únete sys.partitions como p en p .partition_id = a.container_id; unen izquierda sys.internal_tables TI en p.object_id = it.object_id; JOIN sys.tables como t = p.object_id en t.object_id, unir sys.schemas como s = s en t.schema_id. schema_id; -donde t.name = 'Constraints.Level60Zone;.. por grupo de s [nombre], t [nombre]) como subselección ordenado por SchemaName, nombredetabla Puede mantener el sistema principal sp_spaceused con la siguiente secuencia de comandos para obtener la plena utilización del espacio DB; ------------------------------- -------------- CREAR TABLA #TmpTableUsage (varchar NombreTabla (100), NumRows int, int TotalSpace, DataSpace int, int indexspace, UnusedSpace int) Si isnull (object_id ( 'tempdb .. # TmpSpaceUsage'), 0) 0; DROP TABLE #TmpSpaceUsage CREAR TABLA #TmpSpaceUsage (varchar NombreTabla (100), NumRows int, varchar TotalSpace (50), varchar DataSpace (50), varchar indexspace (50), varchar UnusedSpace (50)) Insertar en #TmpSpaceUsage; EXEC sp_MSforeachtable @ comando1 = ""? "EXEC sp_spaceused" Insertar en #TmpTableUsage; seleccione NombreTabla; NumRows; fundido (subcadena (TotalSpace, 1, Len (TotalSpace) -3) como INT) como TotalSpace; fundido (subcadena (DataSpace, 1, Len (DataSpace) -3) como INT) como DataSpace; fundido (subcadena (indexspace, 1, Len (indexspace) -3) como INT) como indexspace; fundido (subcadena (UnusedSpace, 1, Len (UnusedSpace) -3) como INT) como UnusedSpace; desde #TmpSpaceUsage Seleccionar * de #TmpTableUsage No es una solución válida a partir Lnu76 o RK cuando se tiene varias particiones en una tabla no se suman también indexspace está siempre a cero, lo que es malo también. Cambié formato de conseguir por los mejores cuadros incluyendo el uso promedio por espacio de fila Si isnull (object_id ( 'tempdb .. # TmpTableUsage'), 0) 0; DROP TABLE #TmpTableUsage CREAR TABLA #TmpTableUsage (varchar NombreTabla (100), NumRows int, int TotalSpace, DataSpace int, int indexspace, UnusedSpace int) Si isnull (object_id ( 'tempdb .. # TmpSpaceUsage'), 0) 0; DROP TABLE #TmpSpaceUsage CREAR TABLA #TmpSpaceUsage (varchar NombreTabla (100), NumRows int, varchar TotalSpace (50), varchar DataSpace (50), varchar indexspace (50), varchar UnusedSpace (50)) Insertar en #TmpSpaceUsage; EXEC sp_MSforeachtable @ comando1 = ""? "EXEC sp_spaceused" Insertar en #TmpTableUsage; seleccione NombreTabla; NumRows; fundido (subcadena (TotalSpace, 1, Len (TotalSpace) -3) como INT) como TotalSpace; fundido (subcadena (DataSpace, 1, Len (DataSpace) -3) como INT) como DataSpace; fundido (subcadena (indexspace, 1, Len (indexspace) -3) como INT) como indexspace; fundido (subcadena (UnusedSpace, 1, Len (UnusedSpace) -3) como INT) como UnusedSpace; desde #TmpSpaceUsage Seleccione; NombreTabla; NumRows; AvgSpacePerRow = caso cuando CONVERT (decimal (10,2), TotalSpace)> 0 A continuación, convertir (decimal (10,2), CONVERTIR (decimal (10,2), TotalSpace) / NumRows) Else 0 End ; CONVERTIR (decimal (10,2), CONVERTIR (decimal (10,2), TotalSpace) / 1024) como TotalSpaceMB; CONVERT (decimal (10,2), CONVERTIR (decimal (10,2), DataSpace) / 1024) como DataSpaceMB; CONVERT (decimal (10,2), CONVERTIR (decimal (10,2), indexspace) / 1024) como IndexSpaceMB; UnusedSpace como UnusedSpaceKB; desde #TmpTableUsage; Donde NumRows> = 1; por fin la descripción TotalSpace

La primera caricatura publicada en un periódico estadounidense fue escrito por nada menos que el padre fundador de Ben Franklin.