Se você tiver uma tabela ou índice particionado no SQL Server, mas precisar de mais partições, poderá adicionar uma partição à função de partição usando
ALTER PARTITION FUNCTION
instrução com o SPLIT RANGE
argumento. Ao fazer isso, você divide uma partição existente em duas.
Exemplo
Aqui está um exemplo para demonstrar. Primeiro, vamos olhar para a nossa configuração atual.
Configuração atual
Já temos quatro partições e queremos adicionar uma quinta.
Então, já criamos uma função de partição como esta:
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
Esse código resulta em partições que armazenam valores da seguinte maneira.
Partição | Valores |
---|---|
1 | <=–1 |
2 | > –1 E <=100 |
3 | > 100 E <=10000 |
4 | > 10000 |
Para este exemplo, adicionaremos um novo valor de limite de 500.
Então queremos que fique assim:
Partição | Valores |
---|---|
1 | <=–1 |
2 | > –1 E <=100 |
3 | > 100 E <=500 |
4 | > 500 E <=10000 |
5 | > 10000 |
Além disso, para o propósito deste exemplo, imagine que temos uma tabela particionada usando a função de partição acima e que atualmente contém pouco mais de quatro mil linhas de dados.
Vamos dar uma olhada rápida em como as linhas são distribuídas em nossas 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 | +--------------------+-------------+
Então agora queremos adicionar uma nova partição com um valor limite de 500.
Nesse caso, dividiremos a partição entre os valores de limite 100 e 10000.
Devo mencionar que a Microsoft não recomenda a divisão de partições preenchidas. Então isso é algo para se ter em mente.
No entanto, para este exemplo, dividiremos uma partição que contém dados.
Dividir a partição
Aqui é onde vamos em frente e dividimos a partição.
Usamos a
ALTER PARTITION FUNCTION
instrução para dividir a partição. No entanto, dividir uma partição cria duas partições de uma e, portanto, precisamos garantir que haja um grupo de arquivos para a nova partição. Também precisamos garantir que nosso esquema de partição saiba qual grupo de arquivos usar quando dividirmos a partição.
Você pode usar um grupo de arquivos existente ou criar um novo.
Vamos criar um novo.
Aqui está o código que podemos usar para fazer tudo acima:
ALTER DATABASE Test ADD FILEGROUP MoviesFg5;
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg5dat,
FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg5;
ALTER PARTITION SCHEME MoviesPartitionScheme
NEXT USED MoviesFg5;
ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT RANGE (500);
Resultado:
Commands completed successfully.
Dividimos a partição com sucesso.
Verificar a divisão
Agora podemos verificar se a função de partição foi modificada para refletir os novos valores de limite.
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 | +---------------+---------+
Assim, podemos ver que o novo valor de limite foi adicionado com sucesso.
E aqui está como os dados agora 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 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Então agora temos 5 partições.
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.
Dividir partições que contêm dados
Conforme mencionado, a Microsoft não recomenda a divisão de 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.