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
.