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

Obter os valores de limite para uma tabela particionada no SQL Server (T-SQL)


No SQL Server, você pode usar o sys.partition_range_values visualização do catálogo do sistema para descobrir os valores de limite usados ​​para uma tabela particionada.

No entanto, você precisa saber o function_id da função de partição antes de usar essa visualização.

Mas, como sempre, você pode executar uma junção em várias outras tabelas para obter as informações desejadas.

sys.partition_range_values


Primeiro, vamos ver quais colunas os sys.partition_range_values visualização retorna.
 SELECT * FROM sys.partition_range_values;

Resultado:
+---------------+---------------+----------------+---------+
| function_id   | boundary_id   | parameter_id   | value   |
|---------------+---------------+----------------+---------|
| 65542         | 1             | 1              | -1      |
| 65542         | 2             | 1              | 100     |
| 65542         | 3             | 1              | 10000   |
+---------------+---------------+----------------+---------+

Felizmente para mim, tenho apenas uma tabela particionada neste banco de dados, então não sou bombardeado com resultados.

Como mencionado, esta visão retorna o function_id , para que possamos usar isso para unir várias outras tabelas, para que possamos retornar dados para uma tabela específica.

No meu caso, isso é supérfluo, visto que há apenas uma tabela particionada, mas vamos supor que você tenha muitos heaps e índices particionados e queira apenas reduzi-la.

Restringir a uma tabela


Aqui está um exemplo de como retornar os intervalos de limite para uma tabela específica chamada Movies .
SELECT 
    p.partition_number,
    r.boundary_id, 
    r.value AS [Boundary Value]   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
WHERE i.type <= 1 AND t.name = 'Movies' 
ORDER BY p.partition_number ASC;

Resultado:
+--------------------+---------------+------------------+
| partition_number   | boundary_id   | Boundary Value   |
|--------------------+---------------+------------------|
| 1                  | 1             | -1               |
| 2                  | 2             | 100              |
| 3                  | 3             | 10000            |
| 4                  | NULL          | NULL             |
+--------------------+---------------+------------------+

Aqui está novamente, mas expandimos a lista de seleção para incluir outras informações, como o nome do índice, o nome da função de partição etc.
 SELECT 
    t.name AS [Table], 
    i.name AS [Index], 
    p.partition_number,
    f.name,
    r.boundary_id, 
    r.value AS [Boundary Value]   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
WHERE i.type <= 1 AND t.name = 'Movies' 
ORDER BY p.partition_number ASC;

Resultado:
+---------+------------------------------+--------------------+-------------------------+---------------+------------------+
| Table   | Index                        | partition_number   | name                    | boundary_id   | Boundary Value   |
|---------+------------------------------+--------------------+-------------------------+---------------+------------------|
| Movies  | PK__Movies__4BD2941AD44D2FCF | 1                  | MoviesPartitionFunction | 1             | -1               |
| Movies  | PK__Movies__4BD2941AD44D2FCF | 2                  | MoviesPartitionFunction | 2             | 100              |
| Movies  | PK__Movies__4BD2941AD44D2FCF | 3                  | MoviesPartitionFunction | 3             | 10000            |
| Movies  | PK__Movies__4BD2941AD44D2FCF | 4                  | MoviesPartitionFunction | NULL          | NULL             |
+---------+------------------------------+--------------------+-------------------------+---------------+------------------+

Aqui está o resultado novamente usando a saída vertical (para que você não precise rolar para os lados):
-[ RECORD 1 ]-------------------------
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
partition_number | 1
name             | MoviesPartitionFunction
boundary_id      | 1
Boundary Value   | -1
-[ RECORD 2 ]-------------------------
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
partition_number | 2
name             | MoviesPartitionFunction
boundary_id      | 2
Boundary Value   | 100
-[ RECORD 3 ]-------------------------
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
partition_number | 3
name             | MoviesPartitionFunction
boundary_id      | 3
Boundary Value   | 10000
-[ RECORD 4 ]-------------------------
Table            | Movies
Index            | PK__Movies__4BD2941AD44D2FCF
partition_number | 4
name             | MoviesPartitionFunction
boundary_id      | NULL
Boundary Value   | NULL