Announcement

Collapse
No announcement yet.

Ermittlung aller Tabellenspeicher

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ermittlung aller Tabellenspeicher

    Hallo liebe Entwicklerforum-Mitglieder,

    ich stehe gerade vor einem Problem und weiss nicht weiter. Unszwar habe ich ein SQL-Programm geschrieben, was den Speicher aller Tabellen in einer Datenbank ermitteln soll.

    Eine Tabelle soll in der DB angelegt werden, die folgende Spalten haben soll (diese habe ich gemacht):
    - DB_name
    - Schema_name,
    - Table_name,
    - Row_Count (Anzahl Datensätze),
    - Column_Quantitiy (Anzahl Spalten),
    - Data_Space_used
    - Index_Space_used,
    - Unused_Space_used
    - Date (Wann zuletzt die Abfrage gemacht wurde)

    Dann habe ich für die Ermittlung der Tabellenspeicher folgendes Programm geschrieben.

    Code:
    USE muster
    DECLARE @DB_name varchar(50) --DB_name = 'muster'
    DECLARE @cmdstr varchar(100)
    DECLARE @Sort bit
    SELECT @Sort = 0 
    
    /*Erstellen einer Hilfstabelle für Schema #TempSchema*/
    	CREATE TABLE #TempSchema
    	(	TABLE_CATALOG varchar(50),
    		TABLE_SCHEMA varchar (50),
    		TABLE_NAME VARCHAR(50),
    		TABLE_TYPE varchar (10)
    	)
    
    /*Fuellen von Hilfstabelle #TempSchema */
    	INSERT INTO #TempSchema
    	(	TABLE_CATALOG,
    		TABLE_SCHEMA,
    		TABLE_NAME,
    		TABLE_TYPE
    	)
    	SELECT * FROM INFORMATION_SCHEMA.TABLES
    
    
    /*Erstellen einer Hilfstabelle für Schema #TempTable*/
    	CREATE TABLE #TempTable 
    	(	[Table_Name] varchar(50),
    		Row_Count int,
    		Table_Size varchar(50),
    		Data_Space_Used varchar(50),
    		Index_Space_Used varchar(50),
    		Unused_Space varchar(50)
    	 )
    
     /*Fuellen der Abfrage in Hilfstabelle #TempTable*/
    	SELECT @cmdstr = 'sp_msforeachtable ''sp_spaceused "?"'''
    	INSERT INTO #TempTable EXEC(@cmdstr)
    
    
    /* Erstellen von Hilfstabelle #Spaltenanzahl*/
    
    	CREATE TABLE #Spaltenanzahl
    	(	Table_Name varchar(128),
    		Schema_id integer,
    		Column_Quantity int
    	)
    
    /* Fuellen der Hilfstabelle #Spaltenanzahl */
    	INSERT INTO #Spaltenanzahl
    	(
    	Table_Name,
    	Schema_id,
    	Column_Quantity
    	)
    	
    	SELECT Obj.Name, Obj.schema_id, max (col.Column_ID) As Spaltenanzahl
    	FROM sys.All_Objects Obj
    	JOIN Sys.All_Columns  AS Col 
    		ON Col.Object_ID = Obj.Object_ID  
    	WHERE Obj.Type ='U'
    		AND Obj.schema_id = 5 
    		OR Obj.schema_id = 6
    	GROUP BY Obj.Name,
    		obj.schema_id
    	ORDER BY Obj.Name
    
     
     /*Entfernen der 'KB' in den einzelnen Spalten */
    
    IF @Sort = 0 
         BEGIN 
       
         UPDATE #TempTable
    	 SET 
    	 Table_Size = REPLACE(Table_Size,'KB',' '),
    	 Data_Space_Used = REPLACE(Data_Space_Used,'KB',' '),
    	 Index_Space_Used = REPLACE(Index_Space_Used,'KB',' '),
    	 Unused_Space = REPLACE(Unused_Space,'KB',' ')
    	 
    	
     /*Fuellen der Ziel_Tabelle mit Informationen */ 
            INSERT INTO efg.sizes (
    		DB_name,
    		Schema_name,
    		Table_Name,
    		Row_Count,
    		Column_Quantity,
    		Table_Size,
    		Data_Space_Used, 
    		Index_Space_Used,
    		Unused_Space,
    		Date
    		)
    	 SELECT 
    		@DB_name,
    		a.TABLE_SCHEMA,
    		b.Table_Name,
    		b.Row_Count,
    		c.Column_Quantity,
    		CAST (b.Table_Size AS Integer), 
    		CAST (b.Data_Space_Used AS Integer), 
    		CAST (b.Index_Space_Used AS Integer),
    		CAST (b.Unused_Space AS Integer),
    		GETDATE()
    	FROM
    		#TempTable AS b 
    		 INNER JOIN #TempSchema AS a  ON b.Table_Name = a.TABLE_NAME
    		 INNER JOIN #Spaltenanzahl AS c ON b.Table_Name = c.Table_Name
    		 AND b.Table_Name = c.Table_Name
    	
    		 
    	GROUP BY
    		a.TABLE_SCHEMA,
    		b.Table_Name,
    		b.Row_Count,
    		c.Column_Quantity,
    		b.Table_Size, 
    		b.Data_Space_Used,
    		b.Index_Space_Used ,
    		b.Unused_Space 
    	
    	SELECT * FROM efg.sizes
    		ORDER BY 
    		DB_name, 
    		Schema_name, 
    		Table_Name,
    		Table_Size DESC    
     END
    
    ELSE
         BEGIN
         SELECT * FROM #TempTable ORDER BY Table_Size DESC
         SELECT * FROM #TempSchema ORDER BY TABLE_NAME
         SELECT * FROM #Spaltenanzahl ORDER BY Column_Quantity
     END
    
    
    
    /*Loeschen der Hilfstabelle #TempTable */
    DROP TABLE #TempTable
    
    /*Loeschen der Hilfstabelle #TempSchema */
    DROP TABLE #TempSchema
    
    /*Loeschen der Hilfstabelle #Spaltenanzahl */
    DROP TABLE #Spaltenanzahl
    
    /*Loeschen der Hilfstabelle #SchemaTable */
    DROP TABLE #SchemaTable
    ich habe in meiner Datenbank insgesamt 59 Tabellen und 2 Schema-Arten (abc.* und efg.*).

    Mein Problem ist es, wenn ich diese Abfrage ausführe, bekomme ich 65 Tabellen angezeigt, wo 2 Tabellen abc.youtube und efg.youtube jeweils 4 mal angezeigt werden. Eigentlich sollten diese beiden Tabellen jeweils einmal angezeigt werden. Die Tabellen haben den gleichen Tabellennamen "youtube", aber einen ungleichen Schemanamen abc.* und efg.*.

    Wie kann ich dieses verhindern?
    Hat jemand einen Vorschlag?

    Freu mich auf Antworten und bedanke mich im Voraus.

    Gruss
    Deichhaus

  • #2
    Originally posted by Deichhaus View Post
    Hallo liebe Entwicklerforum-Mitglieder,
    Wie kann ich dieses verhindern?
    Hat jemand einen Vorschlag?
    In deinem Abfrage Zeile 104 hinzufügen... (Ungetestet)
    [HIGHLIGHT="SQL"]
    /*Erstellen einer Hilfstabelle für Schema #TempSchema*/
    CREATE TABLE #TempSchema
    ( TABLE_CATALOG varchar(50),
    TABLE_SCHEMA varchar (50),
    TABLE_NAME VARCHAR(50),
    TABLE_TYPE varchar (10)
    )

    /*Fuellen von Hilfstabelle #TempSchema */
    INSERT INTO #TempSchema
    ( TABLE_CATALOG,
    TABLE_SCHEMA,
    TABLE_NAME,
    TABLE_TYPE
    )
    SELECT * FROM INFORMATION_SCHEMA.TABLES


    /*Erstellen einer Hilfstabelle für Schema #TempTable*/
    CREATE TABLE #TempTable
    ( [Table_Name] varchar(50),
    Row_Count int,
    Table_Size varchar(50),
    Data_Space_Used varchar(50),
    Index_Space_Used varchar(50),
    Unused_Space varchar(50)
    )

    /*Fuellen der Abfrage in Hilfstabelle #TempTable*/
    SELECT @cmdstr = 'sp_msforeachtable ''sp_spaceused "?"'''
    INSERT INTO #TempTable EXEC(@cmdstr)


    /* Erstellen von Hilfstabelle #Spaltenanzahl*/

    CREATE TABLE #Spaltenanzahl
    ( Table_Name varchar(128),
    Schema_id integer,
    Column_Quantity int
    )

    /* Fuellen der Hilfstabelle #Spaltenanzahl */
    INSERT INTO #Spaltenanzahl
    (
    Table_Name,
    Schema_id,
    Column_Quantity
    )

    SELECT Obj.Name, Obj.schema_id, max (col.Column_ID) As Spaltenanzahl
    FROM sys.All_Objects Obj
    JOIN Sys.All_Columns AS Col
    ON Col.Object_ID = Obj.Object_ID
    WHERE Obj.Type ='U'
    AND Obj.schema_id = 5
    OR Obj.schema_id = 6
    GROUP BY Obj.Name,
    obj.schema_id
    ORDER BY Obj.Name


    /*Entfernen der 'KB' in den einzelnen Spalten */

    IF @Sort = 0
    BEGIN

    UPDATE #TempTable
    SET
    Table_Size = REPLACE(Table_Size,'KB',' '),
    Data_Space_Used = REPLACE(Data_Space_Used,'KB',' '),
    Index_Space_Used = REPLACE(Index_Space_Used,'KB',' '),
    Unused_Space = REPLACE(Unused_Space,'KB',' ')


    /*Fuellen der Ziel_Tabelle mit Informationen */
    INSERT INTO efg.sizes (
    DB_name,
    Schema_name,
    Table_Name,
    Row_Count,
    Column_Quantity,
    Table_Size,
    Data_Space_Used,
    Index_Space_Used,
    Unused_Space,
    Date
    )
    SELECT
    @DB_name,
    a.TABLE_SCHEMA,
    b.Table_Name,
    b.Row_Count,
    c.Column_Quantity,
    CAST (b.Table_Size AS Integer),
    CAST (b.Data_Space_Used AS Integer),
    CAST (b.Index_Space_Used AS Integer),
    CAST (b.Unused_Space AS Integer),
    GETDATE()
    FROM
    #TempTable AS b
    INNER JOIN #TempSchema AS a ON b.Table_Name = a.TABLE_NAME
    INNER JOIN #Spaltenanzahl AS c ON b.Table_Name = c.Table_Name
    AND b.Table_Name = c.Table_Name
    AND B.Schema_ID = C.Schema_ID


    GROUP BY
    a.TABLE_SCHEMA,
    b.Table_Name,
    b.Row_Count,
    c.Column_Quantity,
    b.Table_Size,
    b.Data_Space_Used,
    b.Index_Space_Used ,
    b.Unused_Space

    SELECT * FROM efg.sizes
    ORDER BY
    DB_name,
    Schema_name,
    Table_Name,
    Table_Size DESC
    END

    ELSE
    BEGIN
    SELECT * FROM #TempTable ORDER BY Table_Size DESC
    SELECT * FROM #TempSchema ORDER BY TABLE_NAME
    SELECT * FROM #Spaltenanzahl ORDER BY Column_Quantity
    END



    /*Loeschen der Hilfstabelle #TempTable */
    DROP TABLE #TempTable

    /*Loeschen der Hilfstabelle #TempSchema */
    DROP TABLE #TempSchema

    /*Loeschen der Hilfstabelle #Spaltenanzahl */
    DROP TABLE #Spaltenanzahl

    /*Loeschen der Hilfstabelle #SchemaTable */
    DROP TABLE #SchemaTable[/CODE]
    [/HIGHLIGHT]

    Comment


    • #3
      @ebis,

      erstmal vielen Dank für deine Antwort.

      Aber in #TempTable AS b ist keine Spalte "Schema_ID" vorhanden. Daher würde dieser Befehl
      Code:
        AND B.Schema_ID = C.Schema_ID
      gar nicht gehen.

      Hast du vielleicht ein anderen Vorschlag?

      Ich danke dir im Voraus.

      Gruss
      Deichhaus

      Comment

      Working...
      X