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.