Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Savoir si une table est partitionnée dans SQL Server (T-SQL)

Si vous avez besoin de savoir si une table a été partitionnée dans SQL Server, vous pouvez exécuter une jointure sur sys.tables , sys.indexes , et sys.partition_schemes vues.

Exemple

Voici un exemple pour illustrer.

SELECT
    t.name AS [Table],
    i.name AS [Index],
    i.type_desc,
    i.is_primary_key,
    ps.name AS [Partition Scheme]
FROM sys.tables t
INNER JOIN sys.indexes i
    ON t.object_id = i.object_id
    AND i.type IN (0,1)
INNER JOIN sys.partition_schemes ps   
    ON i.data_space_id = ps.data_space_id
WHERE t.name = 'Movies';

Résultat :

+---------+------------------------------+-------------+------------------+-----------------------+
| Table   | Index                        | type_desc   | is_primary_key   | Partition Scheme      |
|---------+------------------------------+-------------+------------------+-----------------------|
| Movies  | PK__Movies__4BD2941AD44D2FCF | CLUSTERED   | 1                | MoviesPartitionScheme |
+---------+------------------------------+-------------+------------------+-----------------------+

Ici, il utilise à nouveau la sortie verticale (pour que vous n'ayez pas à faire défiler latéralement):

Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
type_desc        | CLUSTERED
is_primary_key   | 1
Partition Scheme | MoviesPartitionScheme

Je ne renvoie qu'un petit sous-ensemble des colonnes réelles, mais n'hésitez pas à renvoyer les colonnes qui vous intéressent.

De plus, vous pouvez supprimer la dernière ligne pour renvoyer toutes les tables partitionnées.

SELECT
    t.name AS [Table],
    i.name AS [Index],
    i.type_desc,
    i.is_primary_key,
    ps.name AS [Partition Scheme]
FROM sys.tables t
INNER JOIN sys.indexes i
    ON t.object_id = i.object_id
    AND i.type IN (0,1)
INNER JOIN sys.partition_schemes ps   
    ON i.data_space_id = ps.data_space_id;

Résultat :

+---------+------------------------------+-------------+------------------+-----------------------+
| Table   | Index                        | type_desc   | is_primary_key   | Partition Scheme      |
|---------+------------------------------+-------------+------------------+-----------------------|
| Movies  | PK__Movies__4BD2941AD44D2FCF | CLUSTERED   | 1                | MoviesPartitionScheme |
+---------+------------------------------+-------------+------------------+-----------------------+

Dans mon cas, il n'y a qu'une seule table partitionnée dans la base de données.

Juste pour être clair, cela ne renvoie que les tables qui ont été explicitement partitionnées.

Renvoyer les partitions

Vous pouvez également interroger d'autres vues, telles que sys.partitions et sys.dm_db_partition_stats pour renvoyer une liste des partitions pour chaque table.

Notez que ces deux vues renverront également des tables qui n'ont pas été explicitement partitionnées (c'est-à-dire qu'elles n'ont qu'une seule partition). Dans SQL Server, les tables et les vues qui n'ont pas été explicitement partitionnées ont toujours une partition (partition_number =1).

Voici un exemple de sys.dm_db_partition_stats :

SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Movies');

Résultat :

+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 0           |
| 2                  | 100         |
| 3                  | 3979        |
| 4                  | 0           |
+--------------------+-------------+

Voici un exemple où je renvoie les informations de partition pour une table non partitionnée.

SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Cats');

Résultat :

+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 3           |
+--------------------+-------------+

Comme mentionné, il a toujours une partition et son partition_number est 1 .