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

Dividir uma partição em duas no SQL Server (T-SQL)


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.