Hvis du har brug for at finde ud af, om en tabel er blevet partitioneret i SQL Server, kan du køre en join mod sys.tables
, sys.indexes
, og sys.partition_schemes
visninger.
Eksempel
Her er et eksempel til at demonstrere.
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';
Resultat:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
Her bruger den igen lodret output (så du ikke behøver at scrolle sidelæns):
Table | Movies Index | PK__Movies__4BD2941AD44D2FCF type_desc | CLUSTERED is_primary_key | 1 Partition Scheme | MoviesPartitionScheme
Jeg returnerer kun en lille delmængde af de faktiske kolonner, men du er velkommen til at returnere de kolonner, der interesserer dig.
Du kan også fjerne den sidste linje for at returnere alle partitionerede tabeller.
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;
Resultat:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
I mit tilfælde er der kun én opdelt tabel i databasen.
Bare for at være klar, returnerer dette kun tabeller, der eksplicit er blevet partitioneret.
Returner partitionerne
Du kan også forespørge på andre visninger, såsom sys.partitions
og sys.dm_db_partition_stats
for at returnere en liste over partitionerne for hver tabel.
Bemærk, at begge disse visninger også returnerer tabeller, der ikke eksplicit er blevet opdelt (dvs. de har kun én partition). I SQL Server har tabeller og visninger, der ikke eksplicit er blevet partitioneret, stadig en partition (partition_number
=1).
Her er et eksempel på sys.dm_db_partition_stats
:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Movies');
Resultat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Her er et eksempel, hvor jeg returnerer partitionsoplysningerne for en ikke-opdelt tabel.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Cats');
Resultat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 3 | +--------------------+-------------+
Som nævnt har den stadig én partition og dens partition_number
er 1
.