¿Cómo puedo determinar qué tablas están causando que la base de datos crezca con el tiempo?

8

Tengo una base de datos en SQL Server 2008 que está creciendo todo el tiempo, y me gustaría saber qué tablas han causado el mayor crecimiento en los últimos 6 meses.

kashif
fuente
Puede usar una combinación de T-SQL y PowerShell: Monitoreo del crecimiento de la tabla con PowerShell para monitorear y generar tendencias a lo largo del tiempo.
Kin Shah
¿Hasta cuándo tiene copias de seguridad? Puede restaurar los más antiguos y mirar las tablas, registrar la información y comparar de esa manera después de restaurar cada uno.
Ali Razeghi
¿Qué tipo de información tienes en tus tablas? Si se incluye información de tipo de auditoría, como una last_updated_atmarca de tiempo, podría hacer algunas conjeturas bien fundamentadas.
Clockwork-Muse
Puede consultar esta respuesta anterior para empezar. Pero lo más probable es que la lista de Aaron sea el camino a seguir, elija una solución y amplíela. Además, verifique qué está creciendo, ¿es el archivo de datos o puede ser el archivo de registro?
Marian

Respuestas:

15

SQL Server no rastrea esta información. Necesitaría algún tipo de monitoreo (ya sea una herramienta o una cosecha propia) que mantenga instantáneas del espacio de la tabla a lo largo del tiempo. Esto puede ser simple o complejo:

  • Al ver el informe, @Zane destaca en su respuesta y guarda el archivo de vez en cuando;
  • Tomar sus propias instantáneas periódicas de vistas como sys.dm_db_partition_stats;
  • Mirando copias restauradas de copias de seguridad antiguas, como lo sugirió @Ali , sin embargo, quién sabe qué tan lejos van sus copias de seguridad, y si el espacio en disco es un problema, es posible que no tenga el lujo de restaurar un montón de ellas para comparaciones lado a lado de todas formas.
  • Usar una herramienta externa como PowerShell para automatizarlo, como señala el artículo @Kin ;
  • Usando una herramienta de monitoreo completa que rastrea el espacio, la fragmentación, etc. a lo largo del tiempo (Descargo de responsabilidad: trabajo para SQL Sentry).

A menos que ya haya implementado uno o más de estos métodos, o que alguien invente una máquina del tiempo, no hay una buena manera de averiguar qué tan grande era una mesa hace 6 meses, hace dos semanas o hace 20 minutos.

Aaron Bertrand
fuente
13

Si no ha estado capturando y almacenando esas métricas de alguna manera, entonces no hay forma de ver el historial. Sin embargo, puede ver fácilmente qué tablas están usando más disco ahora si eso ayuda.

Botón derecho del ratón

Zane
fuente
2

Ejecuto esto diariamente en una base de datos de clientes para rastrear el crecimiento de tablas individuales a lo largo del tiempo.

DECLARE @names TABLE (
 tableName VARCHAR(128)
 )

INSERT INTO @names
SELECT [name] FROM customerdb.dbo.sysobjects WHERE xtype='U'

WHILE (SELECT COUNT(tableName) FROM @names) > 0
BEGIN

    DECLARE @thisTable VARCHAR(128)
    SET @thisTable = (SELECT TOP 1 tableName FROM @names)
    INSERT INTO mydb.dbo.mytable ([name], [rows], [reserved], [data], [index_size], [unused])
    EXEC sp_spaceused @objname=@thisTable

    DELETE FROM @names
    WHERE tableName = @thisTable

END
usuario41207
fuente
1

Tengo una programación de secuencia de comandos SQL en un trabajo para ejecutar cada semana. Intente escribir un script que obtenga toda la información de sp_spaceused, sys.schemas y sys.tables. y poner eso en una tabla con la fecha de creación. (y puede comenzar a monitorear para el futuro)

Pero si desea averiguar el crecimiento de la tabla de los meses anteriores y si no configuró ningún script o trabajo, probablemente necesite restaurar la copia de seguridad en un entorno de prueba y ver la tabla más alta y comparar cuánto creció a través del tiempo.

Lydia Simeane
fuente
55
¿Por qué no compartir tu guión?
Erik Darling
-2

Cómo lo hago en MySQL sin herramientas adicionales:

Ejecute una consulta como "SHOW TABLE STATUS" y guarde el resultado en una tabla con un campo de marca de tiempo adicional.

Con estos datos tiene un historial de cada tabla y puede elegir sus tablas para la longitud de los datos, las filas o la diferencia más grande. tiempo extraordinario.

Como los datos de estado no son muchos bytes, puede ejecutarlos con un cronjob diario. Funciona perfecto, fácil y gratis con comandos integrados.

.

El mismo procedimiento que el enlace que Marian publicó antes. El comando MS T-SQL debería ser algo así como "SELECCIONAR * DE INFORMACIÓN_SQUEMAS.TABLES" - solo google. Encontré 2 posibles soluciones en segundos:

Listado de todas las tablas en una base de datos y sus recuentos y tamaños de filas: http://www.sqlmatters.com/Articles/Listing%20all%20tables%20in%20a%20database%20and%20their%20row%20counts%20and%20sizes.aspx

SERVIDOR SQL - Consulta para encontrar filas de números, columnas, ByteSize para cada tabla: http://blog.sqlauthority.com/2007/01/10/sql-server-query-to-find-number-rows-columns-bytesize- para-cada-tabla-en-la-base-de-datos-actual-encuentre-la-tabla-más-en-base de datos /

Rossi
fuente