PDA

Vollständige Version anzeigen : MSSQL Tabellengröße ermitteln


strausto
14.07.2007, 11:45
Mit Hilfe fogender Anweisungen lässt sich die Größe der Tabellen einer DB ermitteln

exec sp_MStablespace 'Tabellenname'

CREATE PROCEDURE SP_GetTableSpace

AS

SET NOCOUNT ON

CREATE TABLE #TableSpace (
Rows int,
DataSpaceUsed int,
IndexSpaceUsed int
)

DECLARE @TableSpace table (
TableName varchar(255),
Rows int,
DataSpaceUsed int,
IndexSpaceUsed int
)

DECLARE
@Rows int,
@DataSpaceUsed int,
@IndexSpaceUsed int,
@TableName varchar(255)

DECLARE Table_Cursor CURSOR FOR
SELECT user_name(o.uid) + '.' + o.name AS table_name
FROM dbo.sysobjects o, dbo.sysindexes i
WHERE OBJECTPROPERTY(o.id, N'IsTable') = 1
AND i.id = o.id
AND i.indid < 2
AND o.name NOT LIKE N'#%'
AND xtype = 'U'
ORDER BY 1

OPEN Table_Cursor

FETCH NEXT FROM Table_Cursor INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN

INSERT INTO #TableSpace (Rows, DataSpaceUsed, IndexSpaceUsed)
EXEC sp_MStablespace @TableName

SELECT @Rows = Rows,
@DataSpaceUsed = DataSpaceUsed,
@IndexSpaceUsed = IndexSpaceUsed
FROM #TableSpace

INSERT INTO @TableSpace (TableName, Rows, DataSpaceUsed, IndexSpaceUsed)
VALUES (@TableName, @Rows, @DataSpaceUsed, @IndexSpaceUsed)

DELETE FROM #TableSpace

FETCH NEXT FROM Table_Cursor INTO @TableName
END

CLOSE Table_Cursor
DEALLOCATE Table_Cursor

DROP TABLE #TableSpace

SELECT *
FROM @TableSpace
ORDER BY DataSpaceUsed+IndexSpaceUsed DESC

Danke an letts und ballistic!

Lord Hirni V2
15.06.2011, 16:51
Hallo,

bei mir hat der Code diverse weitere Objekte wie die Windows-Domains etc. herangezogen und Werte mit NULL, die zum Abbruch führten, somit hier eine abgewandelte Form, die bei mir läuft:

USE
Datenbank_XYZ
CREATE TABLE #tbl_TabellenGroesse_A (
fld_TabellenName varchar (99),
fld_ZeilenAnzahl int,
fld_reservierterSpeicher varchar (99),
fld_verwendeterSpeicher varchar (99),
fld_IndexGroesse varchar (99),
fld_zurVerfuegung varchar (99)
)
CREATE TABLE #tbl_TabellenGroesse_B (
fld__Datenbank varchar (99),
fld__Schema varchar (99),
fld__TabellenName varchar (99),
fld__ZeilenAnzahl int,
)
DECLARE @TABLE_CATALOG varchar(99), @TABLE_SCHEMA varchar(99) , @TABLE_NAME varchar(99), @pfad nvarchar(99);
DECLARE @TabellenName varchar(99), @ZeilenAnzahl varchar(99);
DECLARE Employee_Cursor CURSOR FOR
SELECT
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_TYPE = 'BASE TABLE'
ORDER BY
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor INTO @TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @pfad = @TABLE_SCHEMA + '.' + @TABLE_NAME
INSERT INTO #tbl_TabellenGroesse_A (fld_TabellenName, fld_ZeilenAnzahl, fld_reservierterSpeicher, fld_verwendeterSpeicher, fld_IndexGroesse, fld_zurVerfuegung)
exec sp_spaceused @pfad
SELECT
@TabellenName = fld_TabellenName,
@ZeilenAnzahl = fld_ZeilenAnzahl
FROM
#tbl_TabellenGroesse_A
INSERT INTO #tbl_TabellenGroesse_B (fld__Datenbank, fld__Schema, fld__TabellenName, fld__ZeilenAnzahl)
VALUES (@TABLE_CATALOG, @TABLE_SCHEMA, @TabellenName, @ZeilenAnzahl)
DELETE FROM #tbl_TabellenGroesse_A
FETCH NEXT FROM Employee_Cursor into @TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO
SELECT * FROM #tbl_TabellenGroesse_B
ORDER BY fld__Datenbank, fld__Schema , fld__TabellenName, fld__ZeilenAnzahl
DROP TABLE #tbl_TabellenGroesse_A
DROP TABLE #tbl_TabellenGroesse_B
GO

Gruß
Dan