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
.