Übersicht der Objekte je Dateigruppe
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