ALTER PARTITION FUNCTION (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Altera uma função de partição dividindo ou mesclando seus valores de limite. Com a instrução ALTER PARTITION FUNCTION, é possível dividir em duas partições uma partição de tabela ou um índice que usa a função de partição. A instrução também pode mesclar duas partições em uma só.

Cuidado

Mais de uma tabela ou índice podem usar a mesma função de partição. ALTER PARTITION FUNCTION afeta todos em uma única transação.

Convenções de sintaxe de Transact-SQL

Sintaxe

  
ALTER PARTITION FUNCTION partition_function_name()  
{   
    SPLIT RANGE ( boundary_value )  
  | MERGE RANGE ( boundary_value )   
} [ ; ]  

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

partition_function_name
É o nome da função de partição a ser modificada.

SPLIT RANGE ( boundary_value )
Adiciona uma partição à função de partição. boundary_value determina o intervalo da nova partição e deve ser diferente dos intervalos de limite existentes da função de partição. Com base em boundary_value, o mecanismo de banco de dados divide um dos intervalos existentes em dois. Desses dois intervalos, aquele com o novo boundary_value é a nova partição.

É preciso que haja um grupo de arquivos online. E, o esquema de partição que usa a função de partição como NEXT USED para armazenar a nova partição tem que marcar o grupo de arquivos. Uma instrução CREATE PARTITION SCHEME atribui grupos de arquivos a partições. A instrução CREATE PARTITION FUNCTION cria menos partições do que grupos de arquivos para armazená-las. Uma instrução CREATE PARTITION SCHEME pode separar mais grupos de arquivos do que o necessário. Se isso acontecer, você acabará com grupos de arquivos não atribuídos. Além disso, o esquema de partição marca um dos grupos de arquivos como NEXT USED. Esse grupo de arquivos armazena a nova partição. Se não houver grupos de arquivos, o esquema de partições será marcado como NEXT USED e você precisará usar uma instrução ALTER PARTITION SCHEME.

Devido a isso, todos os esquemas de partição que usam a função de partição à qual você está adicionando partições precisam ter um grupo de arquivos NEXT USED. Você pode atribuir um grupo de arquivos que já possui partições para armazenar partições adicionais. Uma função de partição pode participar de mais de um esquema de partição. Por esse motivo, todos os esquemas de partição que usam a função de partição na qual você está adicionando partições têm que ter um grupo de arquivos NEXT USED. Caso contrário, a instrução ALTER PARTITION FUNCTION apresenta falha com um erro que exibe o esquema ou os esquemas de partição que não têm um grupo de arquivos NEXT USED.

Se você criar todas as partições no mesmo grupo de arquivos, esse grupo de arquivos será inicialmente designado a ser o grupo de arquivos NEXT USED automaticamente. No entanto, depois que uma operação de divisão é executada, não há mais um grupo de arquivos NEXT USED selecionado. Atribua explicitamente o grupo de arquivos como o grupo de arquivos NEXT USED usando ALTER PARTITION SCHEME ou uma operação de divisão subsequente irá falhar.

Observação

Limitações com índice columnstore: somente partições vazias podem ser divididas quando existe um índice columnstore na tabela. Você precisará remover ou desabilitar o índice columnstore antes de executar esta operação.

MERGE [ RANGE ( boundary_value) ]
Descarta uma partição e mescla os valores que existirem na partição em uma partição restante. RANGE (boundary_value) precisa ser um valor de limite existente da partição a ser removida. Esse argumento remove o grupo de arquivos que originalmente continha boundary_value do esquema de partição, a menos que uma partição restante o utilize ou marque com a propriedade NEXT USED. A partição mesclada existe no grupo de arquivos que originalmente não continha boundary_value. boundary_value é uma expressão constante que pode fazer referência a variáveis (incluindo variáveis de tipo definido pelo usuário) ou funções (incluindo funções definidas pelo usuário). Eles não podem referenciar uma expressão Transact-SQL. boundary_value tem que corresponder ou ser implicitamente conversível para o tipo de dados de sua coluna de particionamento correspondente. Você também não pode truncar boundary_value durante a conversão implícita de forma que o tamanho e a escala do valor não correspondam aos valores correspondentes ao input_parameter_type.

Observação

Limitações com índice columnstore: duas partições não vazias contendo um índice columnstore não podem ser mescladas. Você precisará remover ou desabilitar o índice columnstore antes de executar esta operação

Práticas Recomendadas

Sempre mantenha as partições vazias em ambas as extremidades do intervalo de partição. Mantenha as partições em ambas as extremidades para garantir que a divisão da partição e a mesclagem da partição não gerem nenhuma movimentação de dados. A divisão da partição ocorre no início e a mesclagem da partição ocorre no final. Evite dividir ou mesclar partições populadas. A divisão ou mesclagem de partições preenchidas pode ser ineficiente. Elas podem ser ineficientes porque a divisão ou mesclagem pode causar até quatro vezes mais geração de logs, e também pode causar bloqueio grave.

A principal razão para colocar suas partições em vários grupos de arquivos é certificar-se de que você pode executar independentemente operações de backup e restauração em partições. Saiba mais sobre grupos de arquivos e estratégias de particionamento em Grupos de arquivos.

Limitações e Restrições

ALTER PARTITION FUNCTION reparticiona quaisquer tabelas e índices que usam a função em uma única operação atômica. Entretanto, essa operação acontece offline e, dependendo da extensão de reparticionamento, pode utilizar muitos recursos.

Use ALTER PARTITION FUNCTION somente para dividir uma partição em duas ou mesclar duas partições em uma. Para alterar a forma como uma tabela é particionada (por exemplo, de 10 partições em cinco), execute qualquer uma das opções a seguir. Dependendo da configuração do sistema, essas opções podem variar em consumo de recursos:

  • Crie uma nova tabela particionada com a função de partição necessária. Em seguida, insira os dados da tabela antiga na nova tabela usando uma instrução INSERT INTO...SELECT FROM.

  • Crie um índice clusterizado particionado em um heap.

    Observação

    Descartando resultados de um índice clusterizado particionado em um heap particionado.

  • Descarte e recrie um índice particionado existente usando a instrução Transact-SQL CREATE INDEX com a cláusula DROP EXISTING = ON.

  • Execute uma sequência de instruções ALTER PARTITION FUNCTION.

Todos os grupos de arquivos afetados por ALTER PARTITION FUNCTION devem estar online.

ALTER PARTITION FUNCTION falha quando há um índice clusterizado desativado em qualquer tabela que usa a função de partição.

O mecanismo de banco de dados não oferece suporte de replicação para modificar uma função de partição. As alterações em uma função de partição no banco de dados de publicação devem ser aplicadas manualmente no banco de dados de assinatura.

Permissões

Qualquer uma das permissões a seguir pode ser usada para executar ALTER PARTITION FUNCTION:

  • Permissão ALTER ANY DATASPACE. Essa permissão tem como padrão os membros da função de servidor fixa sysadmin e das funções de banco de dados fixas db_owner e db_ddladmin.

  • A permissão CONTROL ou ALTER no banco de dados no qual a função de partição foi criada.

  • A permissão CONTROL SERVER ou ALTER ANY DATABASE no servidor do banco de dados no qual a função de partição foi criada.

Exemplos

a. Dividir uma partição de uma tabela ou índice particionado em duas partições

O exemplo a seguir cria uma função de partição para dividir uma tabela ou índice em quatro partições. ALTER PARTITION FUNCTION divide uma das partições em dois para criar um total de cinco partições.

IF EXISTS (SELECT * FROM sys.partition_functions  
    WHERE name = 'myRangePF1')  
DROP PARTITION FUNCTION myRangePF1;  
GO  
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
GO  
--Split the partition between boundary_values 100 and 1000  
--to create two partitions between boundary_values 100 and 500  
--and between boundary_values 500 and 1000.  
ALTER PARTITION FUNCTION myRangePF1 ()  
SPLIT RANGE (500);  

B. Mesclar duas partições de uma tabela particionada em uma partição

O exemplo a seguir cria a mesma função de partição anterior e mescla duas partições em uma, para um total de três partições.

IF EXISTS (SELECT * FROM sys.partition_functions  
    WHERE name = 'myRangePF1')  
DROP PARTITION FUNCTION myRangePF1;  
GO  
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
GO  
--Merge the partitions between boundary_values 1 and 100  
--and between boundary_values 100 and 1000 to create one partition  
--between boundary_values 1 and 1000.  
ALTER PARTITION FUNCTION myRangePF1 ()  
MERGE RANGE (100);  

Próximas etapas

Saiba mais sobre particionamento de tabelas e conceitos relacionados nos seguintes artigos: