Bonjour a tous,
Comment faire pour avoir la liste des tables d'une base de données bien précise et d'avoir la taille qu'occupe chacune de ses table?
Version imprimable
Bonjour a tous,
Comment faire pour avoir la liste des tables d'une base de données bien précise et d'avoir la taille qu'occupe chacune de ses table?
bonjour,
la requête suivante :
select TABLE_NAME
from INFORMATION_SCHEMA.TABLES
va vous donner la liste des tables pour la base concernée.
Dans les propriétés de la table vous avez la taille occupée des données et des index. Par contre je ne sais pas si, et où, cette info est disponible en base.
Christian
Remplace Northwind par le nom de ta base
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 --====================================== -- Auteur : Etienne ZINZINDOHOUE --====================================== USE tempdb GO IF OBJECT_ID('#T_AUDIT_TABLES', 'U') IS NOT NULL DROP TABLE #T_AUDIT_TABLES GO CREATE TABLE #T_AUDIT_TABLES ( [NomTable] nvarchar(255), [NbLignes] char(11) NULL, [EspacePrevu] varchar(18) NULL, [TailleData] varchar(18) NULL, [TailleIndex] varchar(18) NULL, [EspaceInutilise] varchar(18) ) ON [PRIMARY] GO USE Northwind -- Mets ici ta base DECLARE @TabEnCoursTraitement NVARCHAR(255),@SQL NVARCHAR(255), @DEL NVARCHAR (255) CREATE TABLE #LIST_TABLES (nom_table varchar (255)) INSERT INTO #LIST_TABLES SELECT TABLE_SCHEMA+'.'+TABLE_NAME AS [NomTable] FROM information_schema.tables WHERE table_type='BASE TABLE' ORDER BY [NomTable] -- Tant qu'il y a des lignes dans la table temporaire WHILE EXISTS ( SELECT nom_table FROM #LIST_TABLES ) BEGIN --Se positionner sur la 1ère ligne de la table temporaire SET @TabEnCoursTraitement = (SELECT TOP 1 nom_table FROM #LIST_TABLES) -- Insert les infos de la table en cours de traitement dans la table de l'AUDIT SET @SQL = 'INSERT INTO #T_AUDIT_TABLES EXEC sp_spaceused '''+ @TabEnCoursTraitement + ''';' EXEC (@SQL); -- Supprimer la table traitée de la table temporaire SET @DEL = 'DELETE FROM #LIST_TABLES WHERE nom_table = '''+ @TabEnCoursTraitement + ''';' EXEC (@DEL) END --Supprimer la table temporaire DROP TABLE #LIST_TABLES -- AUDIT DES TABLES DE LA BASE DE DONNEES --> Les 10 tables les plus grosses SELECT TOP 10 NomTable , cast(replace([TailleData],'KB','') as int) AS [TailleData (en Ko)] , cast(replace([TailleIndex],'KB','') as int) AS [TailleIndex (en Ko)] ,cast(replace([EspacePrevu],'KB','') as int) AS [EspaceReservé (en Ko)] ,cast(replace([EspaceInutilise],'KB','') as int) AS [EspaceInutilisé (en Ko)] FROM #T_AUDIT_TABLES ORDER BY [TailleData (en Ko)] DESC --> Les 10 tables ayant le plus de lignes SELECT TOP 10 NomTable, cast([NbLignes] as int) AS [Nombre de Lignes] FROM #T_AUDIT_TABLES ORDER BY [Nombre de Lignes] DESC --Supprime la table temporaire DROP TABLE #T_AUDIT_TABLES
y'a quand même plus simple en passant par les vues DM....
A +Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SELECT SCHEMA_NAME(o.schema_id) AS TABLE_SCHEMA, o.name AS TABLE_NAME, 8 * SUM(a.used_pages) AS VOLUME_KO FROM sys.objects AS o INNER JOIN sys.indexes AS i ON o.object_id = i.object_id INNER JOIN sys.partitions AS p ON p.object_id = i.object_id AND p.index_id = i.index_id INNER JOIN sys.allocation_units AS a ON a.container_id = p.partition_id GROUP BY SCHEMA_NAME(o.schema_id), o.name ORDER BY 1, 2;