Om du behöver ta reda på om en tabell har partitionerats i SQL Server kan du köra en join mot sys.tables
, sys.indexes
och sys.partition_schemes
visningar.
Exempel
Här är ett exempel att visa.
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 | +---------+------------------------------+-------------+------------------+-----------------------+
Här använder den återigen vertikal utmatning (så att du inte behöver rulla i sidled):
Table | Movies Index | PK__Movies__4BD2941AD44D2FCF type_desc | CLUSTERED is_primary_key | 1 Partition Scheme | MoviesPartitionScheme
Jag returnerar bara en liten delmängd av de faktiska kolumnerna, men returnera gärna de kolumner som intresserar dig.
Du kan också ta bort den sista raden för att returnera alla partitionerade 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 mitt fall finns det bara en partitionerad tabell i databasen.
Bara för att vara tydlig, returnerar detta bara tabeller som explicit har partitionerats.
Återställ partitionerna
Du kan också fråga efter andra vyer, såsom sys.partitions
och sys.dm_db_partition_stats
för att returnera en lista över partitionerna för varje tabell.
Observera att båda dessa vyer också returnerar tabeller som inte explicit har partitionerats (dvs. de har bara en partition). I SQL Server har tabeller och vyer som inte explicit har partitionerats fortfarande en partition (partition_number
=1).
Här är ett exempel 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 | +--------------------+-------------+
Här är ett exempel där jag returnerar partitionsinformationen för en icke-partitionerad tabell.
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ämnts har den fortfarande en partition och dess partition_number
är 1
.