Wie erhalte ich eine Liste aller partitionierten Tabellen in meiner Datenbank?

Antworten:

21

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.partitionsKatalogansicht 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_numberWert immer gleich 1).

Thomas Stringer
quelle
Das hat 50.000 Objekte zurückgegeben und etwas davon fühlt sich für mich nicht richtig an. Wir befinden uns mitten in einem Upgrade der Peoplesoft Finance-Datenbank von SQL 2005 auf 2008 R2 und es scheint, dass die neuere Version der People-Tools keine partitionierten Tabellen unterstützt. Gibt es eine andere Möglichkeit, die portionierten Tabellen zu identifizieren?
RK Kuppala
1
@yogirk Tut mir leid, Tippfehler. Siehe meine Bearbeitung. Anstelle partition_idin Ihrer WHERE-Klausel benötigen Sie partition_number. Entschuldigen Sie.
Thomas Stringer
Vielen Dank für die Bearbeitung und ich bin froh, dass es ein paar Tische zu bewältigen gibt, genau wie ich erwartet hatte :)
RK Kuppala
@yogirk Viel Spaß damit!
Thomas Stringer
4
Hier liegt ein Fehler vor - die Tabelle kann weiterhin partitioniert werden (mit PF und PS), hat jedoch nur eine Partition. Für diese Tabellen gibt die Abfrage falsche Ergebnisse zurück
Oleg Dok
29

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_schemesEs 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.

Remus Rusanu
quelle
3
Dies ist die richtige Antwort anstelle der ersten - unter Berücksichtigung, ob für die Tabelle das Partitionsschema ON anstelle der Dateigruppe gewählt wurde
Oleg Dok
3

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    
Gast
quelle