Se hai bisogno di scoprire se una tabella è stata partizionata in SQL Server, puoi eseguire un join su sys.tables
, sys.indexes
e sys.partition_schemes
visualizzazioni.
Esempio
Ecco un esempio da dimostrare.
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';
Risultato:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
Eccolo di nuovo usando l'output verticale (in modo da non dover scorrere lateralmente):
Table | Movies Index | PK__Movies__4BD2941AD44D2FCF type_desc | CLUSTERED is_primary_key | 1 Partition Scheme | MoviesPartitionScheme
Sto solo restituendo un piccolo sottoinsieme delle colonne effettive, ma sentiti libero di restituire le colonne che ti interessano.
Inoltre, puoi rimuovere l'ultima riga per restituire tutte le tabelle partizionate.
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;
Risultato:
+---------+------------------------------+-------------+------------------+-----------------------+ | Table | Index | type_desc | is_primary_key | Partition Scheme | |---------+------------------------------+-------------+------------------+-----------------------| | Movies | PK__Movies__4BD2941AD44D2FCF | CLUSTERED | 1 | MoviesPartitionScheme | +---------+------------------------------+-------------+------------------+-----------------------+
Nel mio caso, c'è solo una tabella partizionata nel database.
Solo per essere chiari, questo restituisce solo tabelle che sono state partizionate in modo esplicito.
Restituisci le partizioni
Puoi anche interrogare altre viste, come sys.partitions
e sys.dm_db_partition_stats
per restituire un elenco delle partizioni per ogni tabella.
Nota che entrambe queste viste restituiranno anche tabelle che non sono state esplicitamente partizionate (cioè hanno solo una partizione). In SQL Server, le tabelle e le viste che non sono state partizionate in modo esplicito hanno ancora una partizione (partition_number
=1).
Ecco un esempio di sys.dm_db_partition_stats
:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Movies');
Risultato:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Ecco un esempio in cui restituisco le informazioni sulla partizione per una tabella non partizionata.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Cats');
Risultato:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 3 | +--------------------+-------------+
Come accennato, ha ancora una partizione e il suo partition_number
è 1
.