Comment obtenir une liste de toutes les tables partitionnées dans ma base de données?
Quelles tables système/DMV dois-je consulter?
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).
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.
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