Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

Übersicht der Objekte je Dateigruppe

22. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Das Boardmittel der Dateigruppen gibt es schon ewig im Microsoft SQL Server und das in allen Editionen, einschließlich der Express Editon (ok, in der Compact Edition gibt es das nicht). Je datenspeicherndem Objekt, also für Tabellen, Indizes, separate je Tabelle für BLOB Felder und auch für Partitionen, kann man festlegen, in welcher Dateigruppe es gespeichert werden soll. Einzige Ausnahme sind die PrimaryKey-Indizes, die werden immer in der gleichen Dateigruppe gespeichert; logischerweise, da sie physikalisch zusammen hängen.

Zum Organisieren von großen (in Hinsicht von Speicherplatz) Datenbanken ist das ein gutes und einfaches Mittel, um den verwendeten Speicherplatz über mehrere Dateien und damit Laufwerke hinweg zu verteilen. Zudem kann man Dateigruppen einzeln Sichern & Wiederherstellen. Last but not least kann man einzelne Dateigruppen auf „ReadOnly“ setzten, um so zum Beispiel Archive-Daten zuverlässig vor Änderungen zu schützen (inkl. durch dem DBA; also einem Selbst,). Folglich braucht man die Daten auch nur einmalig sichern; das spart Backup-Ressourcen.

Wenn man bei der Anlage von Objekte konsequent die richtige Dateigruppe berücksichtigt, ist ja auch alles in Ordnung. Aber wie findet man heraus, welches Objekt in welcher Dateigruppe angelegt wurde. Hinzu kommt evtl. noch, dass man Tabellen partitioniert hat und die Partitionen über mehrere Dateigruppen verteilt sind.

Der SQL Server weiß es natürlich und über die System-Views kann man die Daten auch abfragen; hier das T-SQL Statement dazu:

 

 -- Auflistung der Objekte + Indizes  
 -- je Dateigruppe / Partion 
 SELECT DS.name AS DataSpaceName 
  ,AU.type_desc AS AllocationDesc 
  ,AU.total_pages / 128 AS TotalSizeMB 
  ,AU.used_pages / 128 AS UsedSizeMB 
   ,AU.data_pages / 128 AS DataSizeMB 
  ,SCH.name AS SchemaName 
  ,OBJ.type_desc AS ObjectType  
  ,OBJ.name AS ObjectName 
  ,IDX.type_desc AS IndexType 
  ,IDX.name AS IndexName 
 FROM sys.data_spaces AS DS 
  INNER JOIN  
  sys.allocation_units AS AU 
  ON DS.data_space_id = AU.data_space_id 
  INNER JOIN sys.partitions AS PA 
  ON (AU.type IN (1, 3)  
  AND AU.container_id = PA.hobt_id) 
  OR 
  (AU.type = 2 
  AND AU.container_id = PA.partition_id) 
  INNER JOIN sys.objects AS OBJ 
  ON PA.object_id = OBJ.object_id 
  INNER JOIN sys.schemas AS SCH 
  ON OBJ.schema_id = SCH.schema_id 
  LEFT JOIN sys.indexes AS IDX 
  ON PA.object_id = IDX.object_id 
  AND PA.index_id = IDX.index_id 
 ORDER BY DS.name 
  ,SCH.name 
  ,OBJ.name
,IDX.name

Diesen Post teilen

Repost 0

Kommentiere diesen Post