¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

A menudo es importante conocer que tablas o vistas indexadas ocupan un mayor espacio en nuestras bases de datos. Es importante sabe que las vistas indexadas ocupan espacio, ya que mantienen una copia de los datos, por lo tanto tambien incrementan el numero de escrituras a discos cuando se realizan inserciones.

Por ejemplo, la información devuelta por este script es muy util para detectar situaciones de 'fugas de datos', en las que tablas que se limpian periodicamente o en respuesta a un evento, dejan de hacerlo y en consecuencia nuestra base de datos crece desmesuradamente. Para una de estas situaciones escribí el script que se encuentra abajo.

Tambien puede ser muy útil en otras situaciones, como por ejemplo detectar las tablas que más ocupan para optimizar su almacenamiento, o para detectar las tablas con más filas, para pensar en su particionado.

--Cursor que contiene todos los objetos que ocupan espacio

DECLARE objects_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR

      SELECT name FROM

            sysobjects o

      WHERE

            o.xtype = 'S' or --Tablas de sistema

            o.xtype = 'U' or --Tablas de usuario

            o.xtype = 'V' --Vistas (solo las indexadas devuelven tamaño)

--Tabla temporal para albergar los resultados

CREATE TABLE #results

      (name SYSNAME, rows CHAR(11),

      reserved VARCHAR(18), data VARCHAR(18),

      index_size VARCHAR(18),Unused VARCHAR(18))

--Recorremos el cursor obteniendo la información de espacio ocupado

DECLARE @object_name AS SYSNAME

OPEN objects_cursor

FETCH NEXT FROM objects_cursor

INTO @object_name;

WHILE @@FETCH_STATUS = 0

BEGIN

      INSERT INTO #results

            EXEC sp_spaceused @object_name

   

      FETCH NEXT FROM objects_cursor

            INTO @object_name;    

END;

CLOSE objects_cursor;

DEALLOCATE objects_cursor;

-- Quitamos "KB" para poder ordenar

UPDATE

  #results

SET

  reserved = LEFT(reserved,LEN(reserved)-3),
  data = LEFT(data,LEN(data)-3)
,
 
index_size = LEFT(index_size,LEN(index_size)-3)
,

  Unused = LEFT(Unused,LEN(Unused)-3)

--Ordenamos la información por el tamaño ocupado

SELECT

  Name,

  reserved AS [Tamaño en Disco (KB)],

  data AS [Datos (KB)],

  index_size AS [Indices (KB)],

  Unused AS [No usado (KB)],

  Rows AS Filas FROM #results

ORDER BY

  CONVERT(bigint, reserved) DESC

--Eliminar la tabla temporal

DROP TABLE #results

Reseñar que el script anterior solo funciona en SQL Server 2000, para que funcione en SQL Server 2005, tenemos que modificar la declaración del cursor. Esto es debido a que en SQL Server, el procedimiento almacenado sp_spaceused espera el nombre de los objetos calificados con el nombre del esquema al que pertnenecen. Además los tipos de objetos que devuelven en SQL Server información sobre su tamaño son más. En SQL Server 2005 debemos hacer la declaración del cursor como sigue:

DECLARE objects_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY for

      SELECT s.name + '.' + o.name from sys.schemas s

      INNER JOIN sys.objects o

      ON o.schema_id = s.schema_id

      WHERE

            o.type = 'S' or --Tablas de sistema

            o.type = 'U' or --Tablas de usuario

            o.type = 'V' or --Vistas (solo las indexadas devuelven tamaño)

            o.type = 'SQ' or --Cola de servicio

            o.type = 'IT' -- Tablas internas usadas p.e. por el Service Broker o los indices XML

Published 31/10/2006 14:25 por Rodrigo Corral
Archivado en:
Comparte este post:
http://geeks.ms/blogs/rcorral/archive/2006/10/31/_BF00_Cuanto-ocupan-mis-tablas-en-Sql-Server_3F00_.aspx

Comentarios

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Pues no me funciono con mis bases me marca error en las vistas del sistema

Monday, November 06, 2006 7:46 PM por Paloma

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

En SQL Server 2005 o en SQL Server 2000. Piensa que para 2005 tienes que modificar el script como cuento al final del post.

Monday, November 06, 2006 7:59 PM por Rodrigo Corral

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Muchas gracias, funciona perfectamente

Tuesday, May 22, 2007 4:48 PM por mrjack

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

me parce super util este script pero quisiera saber como hago para utilizarlo en todas mis BD sin necesidad de ejecutarlo en cada una, osea que me extraiga la informacion en una sola tabla temporal de todas las tablas de todas las BD de mi servidor, gracias

Tuesday, July 31, 2007 12:44 AM por CesarV

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Gracias Rodrigo,

realmente me funciono, aunque dejame comentar que estoy utilizando sql 2000 y el script tal cual me dio error, esto debido a la inclusion de vistas indizadas, solamente le quite que me incluyera estas vistas indizadas y me obtuvo la información que requeria. el mensaje que obtenia era "Las presentaciones no tienen espacio asignado".

Saludos

Nixon A. Morales

namorales@hotmail.com

Tuesday, November 13, 2007 4:32 PM por Nixon Morales

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

De lujo, gracias tio!!!

Ejecutado en un 2005 con la modi. que indicaste y como la seda.!!! Bestial!

Monday, December 31, 2007 11:10 AM por Azimut

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

funciona muy bacano.

Thursday, April 24, 2008 12:30 AM por B@R

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Gracias por tu aportación es muy util

Tuesday, May 20, 2008 11:01 PM por Hector Leal

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Grande capo !!!!

muy bueno

Wednesday, June 18, 2008 3:20 AM por javier

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Hola que tal, corri el script en un sql 2000 pero hubo algunos errores que me marco. y despues cheque el espacion de la bd y sigue igual no me afecto nada. me urge disminuir el espacio, que mas puedo hacer.

mi correo: ingfranciscom@gmail.com cualquier sugerencia es bienvenida.

Gracias !!!

Wednesday, June 18, 2008 5:06 PM por Hades

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Probé en 2000 y 2005 y funcionan muy bien, gracias por el script. Sigue adelante.

Friday, June 20, 2008 4:53 PM por Fox

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Me resulto muy útil. Sigue adelante

felicito

Cordialmente

AQ

Thursday, July 17, 2008 12:18 AM por AQ

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Viejo Men.. excelente te felicito muy bueno el script. Inicialmente no me funciono porque no tenia vistas indexadas y me salia que las vistas no tienen espacio. Pero lo solucione quitando del where del cursor el filtro de las vistas.

Mil gracias por este script.

Friday, July 25, 2008 3:25 AM por David Cardona

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

excelente y maravilloso doc

Wednesday, July 30, 2008 9:43 PM por peter

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Muy bueno tio, me salvaste la vida

Friday, August 08, 2008 5:56 PM por admin

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Funciono ...Interesante depronto tienes algo parecido para sybase o lo has visto en algun foro.. gracias raul_orlando@hotmail.com

Thursday, November 06, 2008 6:00 PM por Raul Orlando

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

MUCHAS GRACIAS X TU EFICIENTE AYUDA.

YO TAMB COMENTE LA LINEA DE o.xtype = 'V' y jaló muy bien el script.

Excelente!!!!!!!!!

Friday, November 28, 2008 1:27 AM por k4z4d0

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

De lujo. Me funcionó como un tiro. Muchísimas Gracias

Thursday, March 12, 2009 8:14 AM por swift

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Gracias!!! Buenisimo.

Monday, July 20, 2009 2:26 PM por Dario

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Excelente aporte, me sirvio de maravilla!

Friday, August 28, 2009 1:14 AM por Danne

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Mil gracias

me marco unos errores pero me dio la informacion que necesitaba.

Friday, August 28, 2009 1:22 AM por Ernesto

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Muy buen script, es casi de cabecera ;)

Gracias

Friday, October 23, 2009 3:30 PM por Fernando

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Hola, Como estan. Muy buen script, pero como el dicho dice: "si usas cursores....

              Entonces no sabes SQL..."

Basandome en ese dicho (y con el aporte de este post, ofcourse) diseñe una consulta uq hace lo mismo y unas cuantas cosas mas.

Aca se los dejo

select name

  ,(select top 1 row_count from sys.dm_db_partition_stats where object_id=s.object_id)

  ,modify_date

  ,(select  convert(decimal(8,2),(SUM ( CASE

WHEN (index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)

ELSE lob_used_page_count + row_overflow_used_page_count

END

)*0.0078125 ))

FROM sys.dm_db_partition_stats

WHERE object_id = s.object_id) as PESO_TABLA

from sys.tables s

where type_desc = 'USER_TABLE'

order by PESO_TABLA desc

Esta diseñado en 2k5, no lo probe antes, aca en el trabajo si cargamos al servidor de produccion nos aplican, asi que nada de eso.

Solo Scripts livianos.

Bueno se cuidan saludos.

Jim!

Friday, December 04, 2009 6:30 PM por Jim Soto Carmelo

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Eres un zadico maldito, buscate una novia

Monday, December 13, 2010 5:05 PM por Jhon

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

excelente, gracias por la aportacion

Thursday, December 16, 2010 8:46 PM por luis moreno

# re: ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Excelente query funca al 100% en sql 2005.

Muy buen aporte

Wednesday, February 09, 2011 9:03 PM por alexis_1450