Als u wilt weten of een tabel is gepartitioneerd in SQL Server, kunt u een join uitvoeren op de sys.tables
, sys.indexes
, en sys.partition_schemes
weergaven.
Voorbeeld
Hier is een voorbeeld om te demonstreren.
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';
Resultaat:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
Hier is het weer met verticale uitvoer (zodat je niet zijwaarts hoeft te scrollen):
Table | Movies Index | PK__Movies__4BD2941AD44D2FCF type_desc | CLUSTERED is_primary_key | 1 Partition Scheme | MoviesPartitionScheme
Ik stuur slechts een kleine subset van de eigenlijke kolommen terug, maar voel je vrij om de kolommen terug te sturen die je interesseren.
U kunt ook de laatste regel verwijderen om alle gepartitioneerde tabellen terug te geven.
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;
Resultaat:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
In mijn geval is er maar één gepartitioneerde tabel in de database.
Voor de duidelijkheid:dit retourneert alleen tabellen die expliciet zijn gepartitioneerd.
Retourneer de partities
U kunt ook andere weergaven opvragen, zoals sys.partitions
en sys.dm_db_partition_stats
om een lijst met partities voor elke tafel te retourneren.
Merk op dat beide weergaven ook tabellen retourneren die niet expliciet zijn gepartitioneerd (d.w.z. ze hebben slechts één partitie). In SQL Server hebben tabellen en views die niet expliciet zijn gepartitioneerd nog steeds een partitie (partition_number
=1).
Hier is een voorbeeld van sys.dm_db_partition_stats
:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Movies');
Resultaat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Hier is een voorbeeld waarin ik de partitie-info retourneer voor een niet-gepartitioneerde tabel.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Cats');
Resultaat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 3 | +--------------------+-------------+
Zoals vermeld, heeft het nog steeds één partitie en zijn partition_number
is 1
.