Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Descubra se uma tabela é particionada no SQL Server (T-SQL)


Se você precisar descobrir se uma tabela foi particionada no SQL Server, poderá executar uma junção no sys.tables , sys.indexes e sys.partition_schemes Visualizações.

Exemplo


Aqui está um exemplo para demonstrar.
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';

Resultado:
+---------+------------------------------+-------------+------------------+-----------------------+
| Table   | Index                        | type_desc   | is_primary_key   | Partition Scheme      |
|---------+------------------------------+-------------+------------------+-----------------------|
| Movies  | PK__Movies__4BD2941AD44D2FCF | CLUSTERED   | 1                | MoviesPartitionScheme |
+---------+------------------------------+-------------+------------------+-----------------------+

Aqui está novamente usando a saída vertical (para que você não precise rolar para os lados):
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
type_desc        | CLUSTERED
is_primary_key   | 1
Partition Scheme | MoviesPartitionScheme

Estou retornando apenas um pequeno subconjunto das colunas reais, mas sinta-se à vontade para retornar as colunas que lhe interessam.

Além disso, você pode remover a última linha para retornar todas as tabelas particionadas.
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;

Resultado:
+---------+------------------------------+-------------+------------------+-----------------------+
| Table   | Index                        | type_desc   | is_primary_key   | Partition Scheme      |
|---------+------------------------------+-------------+------------------+-----------------------|
| Movies  | PK__Movies__4BD2941AD44D2FCF | CLUSTERED   | 1                | MoviesPartitionScheme |
+---------+------------------------------+-------------+------------------+-----------------------+

No meu caso, há apenas uma tabela particionada no banco de dados.

Só para ficar claro, isso só retorna tabelas que foram particionadas explicitamente.

Retorne as partições


Você também pode consultar outras visualizações, como sys.partitions e sys.dm_db_partition_stats para retornar uma lista das partições de cada tabela.

Observe que ambas as visualizações também retornarão tabelas que não foram particionadas explicitamente (ou seja, elas têm apenas uma partição). No SQL Server, tabelas e exibições que não foram particionadas explicitamente ainda têm uma partição (partition_number =1).

Aqui está um exemplo de sys.dm_db_partition_stats :
SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Movies');

Resultado:
+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 0           |
| 2                  | 100         |
| 3                  | 3979        |
| 4                  | 0           |
+--------------------+-------------+

Aqui está um exemplo onde eu retorno as informações de partição para uma tabela não particionada.
SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('Cats');

Resultado:
+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 3           |
+--------------------+-------------+

Como mencionado, ele ainda tem uma partição e seu partition_number é 1 .