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

Mesclar duas partições em uma no SQL Server (T-SQL)


No SQL Server, você pode usar a ALTER PARTITION FUNCTION para mesclar duas partições em uma partição.

Para fazer isso, use o MERGE RANGE argumento, enquanto fornece o valor limite da partição a ser descartada.

Essa operação descarta a partição e mescla todos os valores existentes na partição em uma partição restante.

Exemplo


Imagine que temos cinco partições que queremos que se tornem quatro.

Partições atuais


Temos uma função de partição chamada MoviesPartitionFunction com quatro valores de fronteira.
SELECT 
    prv.boundary_id,
    prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';

Resultado:
+---------------+---------+
| boundary_id   | value   |
|---------------+---------|
| 1             | -1      |
| 2             | 100     |
| 3             | 500     |
| 4             | 10000   |
+---------------+---------+

Isso significa que existem cinco partições.

Para este exemplo, descartaremos o intervalo de limite 500.

Além disso, imagine que já temos uma tabela com dados distribuídos em algumas dessas partições.

Veja como as linhas estão atualmente distribuídas pelas partições.
SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');

Resultado:
+--------------------+-------------+
| partition_number   | row_count   |
|--------------------+-------------|
| 1                  | 0           |
| 2                  | 100         |
| 3                  | 400         |
| 4                  | 3579        |
| 5                  | 0           |
+--------------------+-------------+

Devo salientar que a Microsoft realmente desaconselha a mesclagem (ou divisão) de partições que contêm dados. No entanto, para o propósito deste exemplo, vamos jogar o cuidado ao vento e mesclar duas partições que contêm dados.

Mesclar as partições


OK, vamos mesclar partições.
ALTER PARTITION FUNCTION MoviesPartitionFunction()  
MERGE RANGE (500);

Resultado:
Commands completed successfully.

Nós mesclamos as partições com sucesso.

Verifique o resultado


Vamos verificar o resultado.
SELECT 
    prv.boundary_id,
    prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';

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

Como esperado, a faixa de limite de 500 foi eliminada e ficamos com apenas três faixas de limite.

Vamos ver como os dados são distribuídos pelas partições.
SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');

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

Novamente, como esperado, os dados das partições 3 e 4 foram mesclados em uma partição (partição 3).

Por que ter partições vazias?


Se você está se perguntando por que tenho partições vazias em cada extremidade, isso é feito especificamente para facilitar a divisão e a mesclagem de partições.

Manter as partições vazias em cada extremidade evita qualquer movimentação inesperada de dados que você pode obter ao dividir ou mesclar partições.

Essa prática também é recomendada pela Microsoft, justamente por esse motivo.

Mesclando partições que contêm dados


Conforme mencionado, a Microsoft não recomenda mesclar partições que já contenham dados.

Dividir ou mesclar partições preenchidas pode ser ineficiente. Eles podem ser ineficientes porque a divisão ou mesclagem pode causar até quatro vezes mais geração de log e também pode causar bloqueios graves.