sql >> Base de Datos >  >> RDS >> Sqlserver

Averigüe si una tabla está particionada en SQL Server (T-SQL)

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 .