Wie erhalte ich eine Liste aller partitionierten Tabellen in meiner Datenbank?
Welche Systemtabellen / DMVs sollte ich mir ansehen?
Wie erhalte ich eine Liste aller partitionierten Tabellen in meiner Datenbank?
Welche Systemtabellen / DMVs sollte ich mir ansehen?
Antworten:
Diese Abfrage sollte Ihnen geben, was Sie wollen:
select distinct t.name
from sys.partitions p
inner join sys.tables t
on p.object_id = t.object_id
where p.partition_number <> 1
Die sys.partitions
Katalogansicht enthält eine Liste aller Partitionen für Tabellen und die meisten Indizes. Mach einfach mit sys.tables
, um die Tische zu bekommen.
Alle Tabellen haben mindestens eine Partition. Wenn Sie also speziell nach partitionierten Tabellen suchen, müssen Sie diese Abfrage nach filtern sys.partitions.partition_number <> 1
(bei nicht partitionierten Tabellen ist der partition_number
Wert immer gleich 1).
partition_id
in Ihrer WHERE-Klausel benötigen Sie partition_number
. Entschuldigen Sie.
Eine bessere Abfrage ist wie folgt:
select object_schema_name(i.object_id) as [schema],
object_name(i.object_id) as [object],
i.name as [index],
s.name as [partition_scheme]
from sys.indexes i
join sys.partition_schemes s on i.data_space_id = s.data_space_id
Dies sucht nach der richtigen Stelle, um das Partitionsschema zu identifizieren: sys.partition_schemes
Es hat die richtige Kardinalität (keine Notwendigkeit distinct
), es zeigt nur partitionierte Objekte an (keine Notwendigkeit für eine Filterklausel where
), es projiziert den Schemanamen und den Partitionsschemanamen. Beachten Sie auch, wie diese Abfrage einen Fehler in der ursprünglichen Frage hervorhebt: Es handelt sich nicht um partitionierte Tabellen , sondern um Indizes (einschließlich Index 0 und 1, auch bekannt als Heap- und Clustered-Index). Eine Tabelle kann mehrere Indizes haben, manche sind partitioniert, andere nicht.
Wie wäre es dann mit der Kombination der 2:
select
object_schema_name(i.object_id) as [schema],
object_name(i.object_id) as [object_name],
t.name as [table_name],
i.name as [index_name],
s.name as [partition_scheme]
from sys.indexes i
join sys.partition_schemes s on i.data_space_id = s.data_space_id
join sys.tables t on i.object_id = t.object_id