web-dev-qa-db-fra.com

Comment obtenir une liste de toutes les tables partitionnées dans ma base de données?

Comment obtenir une liste de toutes les tables partitionnées dans ma base de données?

Quelles tables système/DMV dois-je consulter?

24
RK Kuppala

Cette requête devrait vous donner ce que vous voulez:

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

Le sys.partitions la vue catalogue donne une liste de toutes les partitions pour les tables et la plupart des index. JOIGNEZ simplement cela avec sys.tables pour obtenir les tableaux.

Toutes les tables ont au moins une partition, donc si vous recherchez spécifiquement des tables partitionnées, vous devrez filtrer cette requête en fonction de sys.partitions.partition_number <> 1 (pour les tables non partitionnées, le partition_number est toujours égal à 1).

22
Thomas Stringer

Il me semble qu'une meilleure requête est la suivante:

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

Cela examine l'emplacement "approprié" pour identifier le schéma de partition: sys.partition_schemes , il a la bonne cardinalité (pas besoin de distinct), il montre seulement objet partitionné (pas besoin de une clause de filtrage where), il projette le nom du schéma et le nom du schéma de partition. Notez également comment cette requête met en évidence une faille sur la question d'origine: ce ne sont pas les tables qui sont partitionnées, mais les index (et cela inclut les index 0 et 1, alias. tas et index clusterisé). Une table peut avoir plusieurs index, certains non partitionnés.

29
Remus Rusanu

Eh bien, que diriez-vous de combiner les 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    
3
guest