Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Scopri se una tabella è partizionata in SQL Server (T-SQL)

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 .