begin process at 2013 05 24 22:47:34
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > [SQL SERVEUR] VÉRIFIER L'ESPACE OCCUPÉ DANS UNE BASE DE DONNÉES

[SQL SERVEUR] VÉRIFIER L'ESPACE OCCUPÉ DANS UNE BASE DE DONNÉES


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Trucs & Astuces Classé sous :Occupation, fichier logique, fichier physique, table temporaire Niveau :Initié Date de création :23/01/2009 Date de mise à jour :23/01/2009 11:16:01 Vu :15 609

Auteur : Hyperion

Ecrire un message privé
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Bonjour,

Dans le cadre de mon travail, je dois régulièrement suivre l'occupation des données
dans une base SQL Serveur.

Dans Entreprise Manager d'SQL 2000, on peut facilement visualiser l'occupation des données.
Sous SQL 2005, on peut aussi, mais seulement en changeant le mode de compatibilité,
ce que je ne souhaite pas faire.

Donc, j'ai créé un script qui me permet de récupérer les informations minimales et
nécessaire et les affiche.

Ca fait des années que je profite de toutes les informations du réseau code-sources,
à moi de donner maintenant.

Les points que je trouve intéressant dans mon script, en dehors de sa finalité, c'est :
- Gestion des tables temporaires avec tests de leurs présences.
- Exécution de procédures systèmes et affectation du résultat dans des tables.
- Lectures des emplacements physiques des données.
- Lecture des noms logiques, car certains traitements veulent ces caractéristiques.
- Conversion des valeurs des tables en Mégaoctets.

J'ai choisi de faire un script qui s'exécute indifféremment sous SQL 2000 ou 2005
pour avoir plus de libertés.

Source

  • -- Test et suppression des tables temporaires si elles existent.
  • -- Cela permet d'executer ce script plusieurs fois sana avoir besoin de faire de changements
  • IF EXISTS (SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID = OBJECT_ID(N'TEMPDB..#TableTempInfosData'))
  • DROP TABLE [#TableTempInfosData]
  • IF EXISTS (SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID = OBJECT_ID(N'TEMPDB..#TableTempInfosLog'))
  • DROP TABLE [#TableTempInfosLog]
  • ------------------------------------------------------------------------------------------------------
  • -- Création des tables temporaires
  • -- Cette table réceptionne les informations concernant le fichier de données
  • CREATE TABLE #TableTempInfosData (
  • Identifiant INT,
  • IndexGroupeFichier INT,
  • EspaceTotal INT,
  • EspaceUtiliser INT,
  • NOM VARCHAR(1024),
  • NomFichier VARCHAR(1024)
  • )
  • -- Cette table réceptionne les informations concernant le fichier de logs
  • CREATE TABLE #TableTempInfosLog
  • (
  • NomBase VARCHAR(32),
  • TailleLog REAL,
  • EspaceUtilise REAL,
  • Statut INT
  • )
  • ------------------------------------------------------------------------------------------------------
  • DECLARE @NomDatabase VARCHAR(255)
  • -- Récupération du nom de la base de données en cours
  • SELECT @NomDatabase = DB_NAME(dbid) FROM MASTER..SYSPROCESSES WHERE SPID = @@SPID
  • -- Récupération d'informations générales sur la base en cours
  • DECLARE @NomLogiqueFichierDonnees AS VARCHAR(255)
  • DECLARE @NomPhysiqueFichierDonnees AS VARCHAR(255)
  • DECLARE @TailleFichierDonnees AS INT
  • DECLARE @NomLogiqueFichierLog AS VARCHAR(255)
  • DECLARE @NomPhysiqueFichierLog AS VARCHAR(255)
  • DECLARE @TailleFichierLog AS INT
  • -- Récupération des noms logiques des fichiers de la base en cours
  • SET @NomLogiqueFichierDonnees = FILE_NAME ( 1 )
  • SET @NomLogiqueFichierLog = FILE_NAME ( 2 )
  • -- Récupération des noms physiques des fichiers de la base en cours
  • SELECT @NomPhysiqueFichierDonnees = FILENAME FROM MASTER..SYSALTFILES WHERE NAME = @NomLogiqueFichierDonnees
  • SELECT @NomPhysiqueFichierLog = FILENAME FROM MASTER..SYSALTFILES WHERE NAME = @NomLogiqueFichierLog
  • ------------------------------------------------------------------------------------------------------
  • -- Remplissage des tables temporaires avec les procédures systèmes
  • -- Avec suppression des messages d'informations sans intérêts
  • -- Cette procédure système n'est pas documentée, mais elle est bien utile.
  • -- Elle donne l'occupation des données dans la base active
  • INSERT INTO #TableTempInfosData
  • EXECUTE ('DBCC SHOWFILESTATS WITH NO_INFOMSGS')
  • -- Cette procédure donne l'occupation des données dans le fichier de log
  • INSERT INTO #TableTempInfosLog
  • EXECUTE ('DBCC SQLPERF(LOGSPACE) WITH NO_INFOMSGS')
  • ------------------------------------------------------------------------------------------------------
  • -- Traitement des données
  • DECLARE @TailleData FLOAT
  • DECLARE @DataUtilise FLOAT
  • DECLARE @DataVide FLOAT
  • DECLARE @PourcentDataPleine FLOAT
  • DECLARE @PourcentDataVide FLOAT
  • DECLARE @TailleLog FLOAT
  • DECLARE @EspaceLogUtilise FLOAT
  • DECLARE @EspaceLogVide FLOAT
  • DECLARE @PourcentLogPlein FLOAT
  • DECLARE @PourcentLogVide FLOAT
  • -- Lecture des valeurs du fichier de données
  • SELECT @TailleData = (SUM(EspaceTotal) * 64 * 100) / 1024,
  • @DataUtilise = (SUM(EspaceUtiliser) * 64 * 100) /1024
  • FROM #TableTempInfosData
  • -- Calcul pour avoir la taille en Mega à deux décimales
  • SET @TailleData = @TailleData / 100
  • SET @DataUtilise = @DataUtilise / 100
  • SET @DataVide = @TailleData - @DataUtilise
  • -- Calcul des poucentages d'occupations
  • SET @PourcentDataVide = (1 - @DataUtilise / @TailleData ) * 100
  • SET @PourcentDataPleine = 100 - @PourcentDataVide
  • -- Lecture des valeurs du fichier de log
  • SELECT @TailleLog = TailleLog,
  • @EspaceLogUtilise = (TailleLog * EspaceUtilise) / 100
  • FROM #TableTempInfosLog
  • WHERE NomBase = @NomDatabase
  • -- Calcul l'espace libre dans le fichier de log
  • SET @EspaceLogVide = @TailleLog - @EspaceLogUtilise
  • -- Calcul des poucentages d'occupations
  • SET @PourcentLogVide = (1 - @EspaceLogUtilise / @TailleLog ) * 100
  • SET @PourcentLogPlein = 100 - @PourcentLogVide
  • ------------------------------------------------------------------------------------------------------
  • -- Affichage des différents résultats
  • PRINT '--------------------------------------------------------------------------------------------------------- '
  • PRINT 'BASE : ' + @NomDatabase + ' | Nom Logique Données : ' + @NomLogiqueFichierDonnees+ ' | Nom Logique Logs : ' + @NomLogiqueFichierLog
  • PRINT '--------------------------------------------------------------------------------------------------------- '
  • PRINT 'NOM PHYSIQUE DONNEES | ' + @NomPhysiqueFichierDonnees
  • PRINT 'NOM PHYSIQUE LOGS | ' + @NomPhysiqueFichierLog
  • PRINT '--------------------------------------------------------------------------------------------------------- '
  • PRINT 'FICH DATA TAILLE | ' + CAST(ROUND(@TailleData, 2) AS VARCHAR) + ' Mo'
  • PRINT 'FICH DATA PLEIN | ' + CAST(ROUND(@DataUtilise, 2) AS VARCHAR) + ' Mo - ' + CAST(ROUND(@PourcentDataPleine, 2) AS VARCHAR) + ' %'
  • PRINT 'FICH DATA VIDE | ' + CAST(ROUND(@DataVide, 2) AS VARCHAR) + ' Mo - ' + CAST(ROUND(@PourcentDataVide, 2) AS VARCHAR) + ' %'
  • PRINT '--------------------------------------------------------------------------------------------------------- '
  • PRINT 'FICH LOG TAILLE | ' + CAST(ROUND(@TailleLog, 2) AS VARCHAR) + ' Mo'
  • PRINT 'FICH LOG PLEIN | ' + CAST(ROUND(@EspaceLogUtilise, 2) AS VARCHAR) + ' Mo - ' + CAST(ROUND(@PourcentLogPlein, 2) AS VARCHAR) + ' %'
  • PRINT 'FICH LOG VIDE | ' + CAST(ROUND(@EspaceLogVide, 2) AS VARCHAR) + ' Mo - ' + CAST(ROUND(@PourcentLogVide, 2) AS VARCHAR) + ' %'
  • PRINT '--------------------------------------------------------------------------------------------------------- '
-- Test et suppression des tables temporaires si elles existent.
-- Cela permet d'executer ce script plusieurs fois sana avoir besoin de faire de changements
IF EXISTS (SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID = OBJECT_ID(N'TEMPDB..#TableTempInfosData'))
	DROP TABLE [#TableTempInfosData]

IF EXISTS (SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID = OBJECT_ID(N'TEMPDB..#TableTempInfosLog'))
	DROP TABLE [#TableTempInfosLog]

------------------------------------------------------------------------------------------------------
-- Création des tables temporaires
-- Cette table réceptionne les informations concernant le fichier de données
CREATE TABLE #TableTempInfosData (
	Identifiant INT,
	IndexGroupeFichier INT, 
	EspaceTotal INT, 
	EspaceUtiliser INT,
	NOM VARCHAR(1024),
	NomFichier VARCHAR(1024)
)

-- Cette table réceptionne les informations concernant le fichier de logs
CREATE TABLE #TableTempInfosLog
(
	NomBase VARCHAR(32),
	TailleLog REAL,
	EspaceUtilise REAL,
	Statut INT
)

------------------------------------------------------------------------------------------------------
DECLARE @NomDatabase VARCHAR(255) 

-- Récupération du nom de la base de données en cours
SELECT @NomDatabase = DB_NAME(dbid) FROM MASTER..SYSPROCESSES WHERE SPID = @@SPID

-- Récupération d'informations générales sur la base en cours
DECLARE @NomLogiqueFichierDonnees AS VARCHAR(255)
DECLARE @NomPhysiqueFichierDonnees AS VARCHAR(255)
DECLARE @TailleFichierDonnees AS INT

DECLARE @NomLogiqueFichierLog AS VARCHAR(255)
DECLARE @NomPhysiqueFichierLog AS VARCHAR(255)
DECLARE @TailleFichierLog AS INT

-- Récupération des noms logiques des fichiers de la base en cours
SET @NomLogiqueFichierDonnees = FILE_NAME ( 1 ) 
SET @NomLogiqueFichierLog = FILE_NAME ( 2 ) 

-- Récupération des noms physiques des fichiers de la base en cours
SELECT @NomPhysiqueFichierDonnees = FILENAME FROM MASTER..SYSALTFILES WHERE NAME = @NomLogiqueFichierDonnees
SELECT @NomPhysiqueFichierLog = FILENAME FROM MASTER..SYSALTFILES WHERE NAME = @NomLogiqueFichierLog

------------------------------------------------------------------------------------------------------
-- Remplissage des tables temporaires avec les procédures systèmes
-- Avec suppression des messages d'informations sans intérêts

-- Cette procédure système n'est pas documentée, mais elle est bien utile.
-- Elle donne l'occupation des données dans la base active
INSERT INTO #TableTempInfosData 
EXECUTE ('DBCC SHOWFILESTATS WITH NO_INFOMSGS')

-- Cette procédure donne l'occupation des données dans le fichier de log
INSERT INTO #TableTempInfosLog 
EXECUTE ('DBCC SQLPERF(LOGSPACE) WITH NO_INFOMSGS')

------------------------------------------------------------------------------------------------------
-- Traitement des données
DECLARE @TailleData FLOAT
DECLARE @DataUtilise FLOAT
DECLARE @DataVide FLOAT
DECLARE @PourcentDataPleine FLOAT
DECLARE @PourcentDataVide FLOAT

DECLARE @TailleLog FLOAT
DECLARE @EspaceLogUtilise FLOAT
DECLARE @EspaceLogVide FLOAT
DECLARE @PourcentLogPlein FLOAT
DECLARE @PourcentLogVide FLOAT

-- Lecture des valeurs du fichier de données
SELECT @TailleData = (SUM(EspaceTotal) * 64 * 100) / 1024, 
@DataUtilise = (SUM(EspaceUtiliser) * 64 * 100) /1024 
FROM #TableTempInfosData

-- Calcul pour avoir la taille en Mega à deux décimales
SET @TailleData = @TailleData / 100
SET @DataUtilise = @DataUtilise / 100
SET @DataVide = @TailleData - @DataUtilise

-- Calcul des poucentages d'occupations
SET @PourcentDataVide = (1 - @DataUtilise / @TailleData ) * 100
SET @PourcentDataPleine = 100 - @PourcentDataVide

-- Lecture des valeurs du fichier de log
SELECT @TailleLog = TailleLog, 
@EspaceLogUtilise = (TailleLog * EspaceUtilise) / 100
FROM #TableTempInfosLog 
WHERE NomBase = @NomDatabase

-- Calcul l'espace libre dans le fichier de log
SET @EspaceLogVide = @TailleLog - @EspaceLogUtilise

-- Calcul des poucentages d'occupations
SET @PourcentLogVide = (1 - @EspaceLogUtilise / @TailleLog ) * 100
SET @PourcentLogPlein = 100 - @PourcentLogVide

------------------------------------------------------------------------------------------------------
-- Affichage des différents résultats
PRINT '--------------------------------------------------------------------------------------------------------- ' 
PRINT 'BASE :  ' + @NomDatabase + '   |   Nom Logique Données :  ' + @NomLogiqueFichierDonnees+ '   |   Nom Logique Logs :  ' + @NomLogiqueFichierLog
PRINT '--------------------------------------------------------------------------------------------------------- ' 
PRINT 'NOM PHYSIQUE DONNEES | ' + @NomPhysiqueFichierDonnees
PRINT 'NOM PHYSIQUE LOGS    | ' + @NomPhysiqueFichierLog
PRINT '--------------------------------------------------------------------------------------------------------- ' 
PRINT 'FICH DATA TAILLE     | ' + CAST(ROUND(@TailleData, 2) AS VARCHAR) + ' Mo'
PRINT 'FICH DATA PLEIN      | ' + CAST(ROUND(@DataUtilise, 2) AS VARCHAR) + ' Mo - ' + CAST(ROUND(@PourcentDataPleine, 2) AS VARCHAR) + ' %'
PRINT 'FICH DATA VIDE       | ' + CAST(ROUND(@DataVide, 2) AS VARCHAR) + ' Mo - ' + CAST(ROUND(@PourcentDataVide, 2) AS VARCHAR) + ' %'
PRINT '--------------------------------------------------------------------------------------------------------- ' 
PRINT 'FICH LOG TAILLE      | ' + CAST(ROUND(@TailleLog, 2) AS VARCHAR) + ' Mo'
PRINT 'FICH LOG PLEIN       | ' + CAST(ROUND(@EspaceLogUtilise, 2) AS VARCHAR) + ' Mo - ' + CAST(ROUND(@PourcentLogPlein, 2) AS VARCHAR) + ' %'
PRINT 'FICH LOG VIDE        | ' + CAST(ROUND(@EspaceLogVide, 2) AS VARCHAR) + ' Mo - ' + CAST(ROUND(@PourcentLogVide, 2) AS VARCHAR) + ' %'
PRINT '--------------------------------------------------------------------------------------------------------- ' 

 Conclusion

J'espère que vous trouverez un intérêt à cette source.
Les seules sources s'en approchant ici, parle de la place sur disque dur,
mais rien sur l'occupation dans l'enveloppe de la base.


 Historique

23 janvier 2009 11:13:21 :
Mise en page. :)
23 janvier 2009 11:16:01 :
-

 Sources de la même categorie

CHERCHER LES PROCÉDURES STOCKÉES CONTENANT UN MOT-CLÉ OU UN ... par white_mage
SUPPRESSION DES ESPACES MULTIPLE D'UNE CHAÎNE (ORACLE ,SQL) par lamjed
TRANSFORMER UNE CHAÎNE EN UN TABLEAU D'ENREGISTREMENT (ORACL... par lamjed
ESPACE LIBRE PAR TABLESPACE par lamjed
JOURS FÉRIÉ HIRJI TUNISIE par lamjed

 Sources en rapport avec celle ci

Source avec une capture T-SQL - SPLIT SANS TABLE TEMPORAIRE par TheOnlyMaX
T-SQL - PROCÉDURE - STOCKÉE - PLACER DANS UNE TABLE LE RÉSUL... par zavier666

Commentaires et avis

Commentaire de bambiseb le 27/01/2009 09:14:14

Salut,

j'ai copié le script. Tout d'abord merci d'avoir pris le soin de l'avoir mis en ligne.
J'aurais voulu mieux comprendre l'intér^t de récupérer ces informations, si vous pourriez m'expliquer plus en détail.
Merci par avance.

Par contre, j'ai plusieurs BDD et le script évalue toujours du moins affiche toujours le même ficher mld et ldf.

A bientôt

Commentaire de Hyperion le 27/01/2009 09:48:20

L'intérêt est de surveiller facilement de remplissage réel de la base de données.
Pendant un gros traitement de mise à jour par exemple.

Les logs peuvent atteindre une très grosse taille pendant un traitement et être vide à
l'intérieur après, mais ils continueront à occuper la même place sur disque dur.

Pour changer de base, il faut en sélectionner une autre dans l'analyseur de requête
(Au milieu, en haut du logiciel).

La procédure DBCC SHOWFILESTAT ne sait malheureusement que traité la base active.

On pourrait mettre ce script dans un curseur de balayage si nécessaire pour en surveiller d'autres.

Commentaire de bambiseb le 27/01/2009 11:12:43

Ok, merci pour cette éclaircicement, concernant la BDD active, je l'ai bien sélectionnée ne amont, j'ai tout de même l'impression que les statistiques sont modifiées, il s'agit simplement de l'affichage du chemin qui ne change pas.

Commentaire de spiralcb le 23/02/2009 09:17:35

Bonjour,

Deux remarques, on peut utiliser la procédure stocké SP_MSForEachDB pour balayer l'ensemble des bases dans une instance.

Sinon, ayant des bases un peu volumétrique, j'ai jamais certains INT en BIGINT.

Commentaire de spiralcb le 23/02/2009 09:19:10

Oups me suis trompé : j'ai CHANGE certains INT en BIGINT.

Commentaire de crn_c21 le 09/03/2009 16:17:10

Très intéressant
Merci

Je l'ai incorporé à une proc de gestion d'espace disque avec un envoi de mail d'alerte lorsque  le rapport taille disque/taille base devient inférieur à un certain seuil

Commentaire de NonoNantes le 11/06/2009 17:33:58 7/10

Bonjour,

Oui, ce script est intéressant, j'ai juste eu à mettre quelques infos en minuscules, ma base étant Case Sensitive (FRENCH_CS_AS)...

Par contre, je que je cherche, c'est un script qui permette, pour toutes les tables d'une base d'afficher le nombre de lignes et la taille utilisée.
(infos que l'on a en faisant click droit propriétés sur une table, mais quand on a 100 tables ... :-( )

Si qqn a ca sous le coude :-)

Commentaire de NonoNantes le 12/06/2009 15:25:28

Re ...
Apres avoir continué mes recherches hier, j'ai trouvé un élément de solution et j'ai développé le truc ...
J'ai posté ca là (ou qqn cherchait exactement la meme chose que moi):
http://www.sqlfr.com/forum/sujet-TAILLE-TOUTES-TABLES-DANS-BASE_955109.aspx
voilà.
++
Nono

Commentaire de dymsbess le 15/06/2009 13:36:07

Voici un autre lien pour la volumétrie des tables :
http://www.xoowiki.com/Article/SQL-Server/volumetrie-des-tables-174.aspx

Commentaire de lfresel le 09/12/2009 11:11:17

Personnellement j'ai modifié les lignes 81/83 par ceci

-- Lecture des valeurs du fichier de données
SELECT @TailleData = (SUM(EspaceTotal) * 64 ) / 10.24,
@DataUtilise = (SUM(EspaceUtiliser) * 64 ) /10.24
FROM #TableTempInfosData

car j'avais un dépassement de capacité, que ce soit dans un float, un int ou un bigint

merci de ton code source !
Luc

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales