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

Réponses:

21

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

La sys.partitionsvue catalogue donne une liste de toutes les partitions pour les tables et la plupart des index. JOIGNEZ simplement cela avec sys.tablespour 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_numberest toujours égal à 1).

Thomas Stringer
la source
cela a rendu 50 000 objets et quelque chose ne me semble pas juste. Nous sommes au milieu d'une mise à niveau de Peoplesoft Finance db de SQL 2005 à 2008 R2 et il semble que la nouvelle version des outils People ne supporte pas les tables partitionnées. Existe-t-il un autre moyen d'identifier les tables fractionnées?
RK Kuppala
1
@yogirk Désolé, faute de frappe. Voir mon montage. Au lieu de partition_iddans votre clause WHERE, vous avez besoin partition_number. Mes excuses.
Thomas Stringer
Merci pour l'édition et je suis content qu'il y ait peu de tables à aborder, comme je m'y attendais :)
RK Kuppala
@yogirk Amusez-vous avec ça!
Thomas Stringer
4
Il y a une erreur ici - la table peut toujours être partitionnée (en utilisant PF et PS) mais avec une seule partition. Donc, pour ces tables, la requête renvoie des résultats erronés
Oleg Dok
29

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_schemesil a la bonne cardinalité (pas besoin de distinct), il n'affiche que les objets partitionnés (pas besoin de whereclause de filtrage ), 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. Heap et index clusterisé). Une table peut avoir plusieurs index, certains non partitionnés.

Remus Rusanu
la source
3
C'est la bonne réponse au lieu de la 1ère - en tenant compte si la table est sur le schéma de partition ON au lieu du groupe de fichiers
Oleg Dok
3

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    
client
la source