Si necesita averiguar si una tabla se ha particionado en SQL Server, puede ejecutar una unión contra sys.tables
, sys.indexes
y sys.partition_schemes
vistas.
Ejemplo
Aquí hay un ejemplo para demostrarlo.
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 | +---------+------------------------------+-------------+------------------+-----------------------+
Aquí está nuevamente usando la salida vertical (para que no tenga que desplazarse hacia los lados):
Table | Movies Index | PK__Movies__4BD2941AD44D2FCF type_desc | CLUSTERED is_primary_key | 1 Partition Scheme | MoviesPartitionScheme
Solo devuelvo un pequeño subconjunto de las columnas reales, pero no dude en devolver las columnas que le interesen.
Además, puede eliminar la última línea para devolver todas las tablas 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 | +---------+------------------------------+-------------+------------------+-----------------------+
En mi caso, solo hay una tabla particionada en la base de datos.
Para que quede claro, esto solo devuelve tablas que se han particionado explícitamente.
Devolver las particiones
También puede consultar otras vistas, como sys.partitions
y sys.dm_db_partition_stats
para devolver una lista de las particiones de cada tabla.
Tenga en cuenta que ambas vistas también devolverán tablas que no se han particionado explícitamente (es decir, solo tienen una partición). En SQL Server, las tablas y vistas que no se han particionado explícitamente aún tienen una partición (partition_number
=1).
Aquí hay un ejemplo 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 | +--------------------+-------------+
Aquí hay un ejemplo en el que devuelvo la información de la partición para una tabla sin particiones.
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 se mencionó, todavía tiene una partición y su partition_number
es 1
.