Comment puis-je déterminer quelles tables entraînent la croissance de la base de données au fil du temps?

8

J'ai une base de données dans SQL Server 2008 qui ne cesse de croître, et j'aimerais savoir quelles tables ont provoqué la plus forte croissance au cours des 6 derniers mois.

kashif
la source
Vous pouvez utiliser une combinaison de T-SQL et PowerShell - Surveillance de la croissance de la table avec PowerShell pour la surveiller et la suivre dans le temps.
Kin Shah
À quelle distance avez-vous des sauvegardes? Vous pouvez restaurer les plus anciens et consulter les tableaux, enregistrer les informations et comparer de cette façon après chaque restauration.
Ali Razeghi
Quel type d'informations avez-vous dans vos tableaux? Si cela inclut des informations de type audit, comme un last_updated_athorodatage, vous pouvez faire de bonnes suppositions.
Clockwork-Muse
Vous pouvez vérifier cette réponse précédente pour un démarreur. Mais la liste d'Aaron est probablement la voie à suivre, choisissez une solution et construisez-la. Vérifiez également ce qui grandit, s'agit-il du fichier de données ou du fichier journal?
Marian

Réponses:

15

SQL Server ne suit pas ces informations. Vous auriez besoin d'une sorte de surveillance (que ce soit un outil ou un outil maison) qui conserve des instantanés de l'espace table au fil du temps. Cela peut être simple ou complexe:

  • Afficher le rapport @Zane met en évidence dans sa réponse et enregistrer le fichier de temps en temps;
  • Prendre vos propres instantanés périodiques de vues comme sys.dm_db_partition_stats;
  • En regardant des copies restaurées de sauvegardes plus anciennes, comme suggéré par @Ali - mais qui sait jusqu'où vos sauvegardes vont et si l'espace disque est un problème, vous pourriez ne pas avoir le luxe d'en restaurer un tas pour des comparaisons côte à côte en tous cas.
  • Utiliser un outil externe comme PowerShell pour l'automatiser, comme le souligne l'article @Kin ;
  • Utilisation d'un outil de surveillance complet qui suit l'espace, la fragmentation, etc. au fil du temps (Avertissement: je travaille pour SQL Sentry).

À moins d'avoir déjà mis en œuvre une ou plusieurs de ces méthodes, ou d'avoir inventé une machine à remonter le temps, il n'y a pas vraiment de bon moyen de déterminer la taille d'une table il y a 6 mois, ou il y a deux semaines ou 20 minutes.

Aaron Bertrand
la source
13

Si vous n'avez pas capturé et stocké ces mesures d'une manière ou d'une autre, il n'y a aucun moyen de voir l'historique. Cependant, vous pouvez voir facilement quelles tables utilisent le plus de disque maintenant si cela vous aide.

Clic-droit

Zane
la source
2

Je l'exécute quotidiennement sur une base de données clients pour suivre la croissance de chaque table au fil du temps.

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
user41207
la source
1

J'ai un calendrier de script SQL sur un travail à exécuter chaque semaine. Essayez d'écrire un script qui obtient toutes les informations de sp_spaceused, sys.schemas et sys.tables. et mettez cela dans un tableau avec la date de création. (et vous pouvez commencer à surveiller pour l'avenir)

Mais si vous voulez connaître la croissance de la table pour les mois précédents et si vous n'avez pas configuré de script ou de travail, vous devrez probablement restaurer la sauvegarde dans un environnement de test et regarder la table la plus élevée et comparer combien elle a augmenté. À travers le temps.

Lydia Simeane
la source
5
Pourquoi ne pas partager votre script?
Erik Darling
-2

Comment je le fais dans MySQL sans outils supplémentaires:

Exécutez une requête comme "SHOW TABLE STATUS" et enregistrez le résultat dans une table avec un champ d'horodatage supplémentaire.

Avec ces données, vous avez un historique de chaque table et pouvez choisir vos tables pour la longueur des données, les lignes ou la plus grande différence. heures supplémentaires.

Comme les données d'état ne sont pas beaucoup d'octets, vous pouvez les exécuter avec un cronjob quotidien. Fonctionne parfaitement, facilement et gratuitement avec des commandes intégrées.

.

Même procédure que le lien que Marian a posté auparavant. La commande MS T-SQL devrait être quelque chose comme "SELECT * FROM INFORMATION_SCHEMA.TABLES" - juste google. J'ai trouvé 2 solutions possibles en quelques secondes:

Liste de toutes les tables dans une base de données et leurs nombres et tailles de lignes: http://www.sqlmatters.com/Articles/Listing%20all%20tables%20in%20a%20database%20and%20their%20row%20counts%20and%20sizes.aspx

SERVEUR SQL - Requête pour trouver le nombre de lignes, colonnes, ByteSize pour chaque table: http://blog.sqlauthority.com/2007/01/10/sql-server-query-to-find-number-rows-columns-bytesize- pour-chaque-table-dans-la-base-de-données-courante-trouver-la-plus-grande-table-dans-base de données /

Rossi
la source