Transferindo dados de forma eficaz usando a alternância de partição

O particionamento de dados o habilita a gerenciar e acessar subconjuntos de dados de forma rápida e eficaz e, ao mesmo tempo, manter a integridade da coleção de dados inteira. Você pode usar a instrução Transact-SQL ALTER TABLE...SWITCH para transferir de forma rápida e eficaz subconjuntos de dados como se segue:

  • Atribuindo uma tabela como partição a uma tabela particionada já existente.

  • Alternando a partição de uma tabela particionada para outra.

  • Reatribuindo uma partição para formar uma tabela única.

Para obter informações sobre os conceitos da alternância de partição e ver o exemplo ReadMe_SlidingWindow. Para obter informações sobre exemplos, consulte Considerações para instalar exemplos e bancos de dados de exemplo do SQL Server.

Requisitos gerais para alternar partições

Quando uma partição é transferida, os dados não são fisicamente movidos; apenas os metadados sobre o local dos dados são alterados. Antes de você poder alternar as partições, vários requisitos devem ser cumpridos:

  • Ambas as tabelas devem existir antes da operação SWITCH. Antes de realizar a operação de alternância, a tabela de onde a partição está sendo movida (a tabela de origem) e a tabela que está recebendo a partição (a tabela de destino) devem existir no banco de dados.

  • A partição receptora deve existir e deve estar vazia. Se estiver adicionando uma tabela como partição em uma tabela particionada já existente, ou movendo uma partição de uma tabela particionada para outra, a partição que receber essa nova partição deve existir e deve ser uma partição vazia.

  • A tabela receptora não particionada deve existir e deve estar vazia. Se estiver atribuindo novamente uma partição para formar uma tabela não particionada, a tabela que receber a nova partição deve existir e deve ser uma tabela não particionada vazia.

  • As partições devem estar na mesma coluna. Se estiver alternando uma partição de uma tabela particionada para outra, ambas as tabelas devem estar particionadas na mesma coluna.

  • As tabelas de origem e de destino devem compartilhar o mesmo grupo de arquivos. As tabelas de origem e de destino da instrução ALTER TABLE...SWITCH devem residir no mesmo grupo de arquivos e suas colunas de valor alto devem estar armazenadas no mesmo grupo de arquivos. Qualquer índice correspondente, partições de índice ou partições de exibição indexada devem também residir no mesmo grupo de arquivos. Porém, o grupo de arquivos pode ser diferente daquele das tabelas ou dos demais índices correspondentes.

Para obter informações sobre a alternância de partição quando exibições indexadas estão definidas, consulte Alternando partições quando exibições indexadas estão definidas.

Requisitos para a estrutura de índices e de tabelas

Além dos requisitos gerais acima, as tabelas de origem e de destino devem ter a mesma estrutura. Os requisitos de estrutura são os seguintes:

  • As tabelas de origem e de destino devem ter a mesma estrutura e ordem de colunas. As tabelas devem ter as mesmas colunas com o mesmo nome e o mesmo tipo de dados, comprimento, agrupamento, precisão, escala, nulidade e restrições PRIMARY KEY (se houver), bem como ter as mesmas definições para ANSI_NULLS e QUOTED IDENTIFIER. Além disso, as colunas devem ser definidas na mesma ordem. A propriedade IDENTITY não é considerada.

    Observação sobre cuidadosCuidado

    A alternância de partição pode apresentar valores duplicados nas colunas IDENTITY da tabela de destino e intervalos nos valores das colunas IDENTITY da tabela de origem. Use DBCC CHECKIDENT para verificar os valores de identidade de suas tabelas e corrigir os valores, se assim desejar.

  • A nulidade das colunas de particionamento deve coincidir. As tabelas de origem e de destino devem ser NULL ou NOT NULL. Se uma das tabelas não for particionada, a nulidade da coluna correspondente à coluna de particionamento da outra tabela deve coincidir com a coluna da tabela particionada.

    Observação importanteImportante

    Recomendamos que você especifique NOT NULL na coluna de particionamento das tabelas particionadas. Recomendamos também especificar NOT NULL nas tabelas não particionadas que são as origens e os destinos para as operações ALTER TABLE...SWITCH. Quando as colunas particionadas são NOT NULL, qualquer restrição CHECK nas colunas de particionamento não será forçada a verificar valores nulos. Os valores nulos são geralmente colocados na partição mais a esquerda de uma tabela particionada. A ausência de uma restrição NOT NULL, nas tabelas de origem e de destino, pode interferir com qualquer restrição CHECK também definida na coluna de particionamento quando for alternar uma partição diferente da partição mais à esquerda e quando a opção do banco de dados ANSI_NULLS estiver definida para ON.

  • As colunas computadas devem ter a mesma sintaxe. Se as suas chaves de partição correspondentes forem colunas computadas, a sintaxe das expressões que definem suas colunas computadas é a mesma e ambas as colunas são persistentes.

  • As propriedades ROWGUID devem ser as mesmas. Qualquer coluna definida com a propriedade ROWGUID deve corresponder a uma coluna na outra tabela também definida com uma propriedade ROWGUID.

  • As colunas XML devem ter o mesmo esquema. Qualquer coluna xml deve ser digitada para a mesma coleção de esquemas XML.

  • As configurações em-linha de qualquer texto, ntext ou colunas de imagem devem ser as mesmas. Para obter mais informações sobre essa configuração, consulte Dados em linha.

  • As tabelas devem ter os mesmos índices cluster. As tabelas de origem e de destino devem ter os mesmos índices clusterizado e os índices não podem ser desabilitados antes da alternância das partições.

  • Índices não cluster devem ser definidos e devem ser idênticos. Qualquer índice não cluster definido na tabela de destino é também definido na tabela de origem e é estruturado de forma idêntica em termos de exclusividade, subchaves e direção da classificação (ASC ou DESC) para cada coluna de chave de índice. Índices não cluster desabilitados são isentos dessa exigência.

Requisitos de restrição

Os requisitos de restrição adicionais a seguir devem ser cumpridos para mover partições:

  • As restrições CHECK devem ser uma correspondência exata ou serem aplicáveis à origem e ao destino. Qualquer restrição CHECK definida na tabela de destino deve ser definida na tabela de origem como uma correspondência exata ou como aplicável (por exemplo, como um subconjunto) às restrições CHECK da tabela de destino.

  • As restrições em colunas int devem ser as mesmas ou um subconjunto. Qualquer restrição CHECK nas colunas int na tabela de origem deve coincidir ou existir como um subconjunto de restrições na coluna int da tabela de destino. Por exemplo, se a tabela de destino tiver uma restrição em um int coluna Column1 que especifica Column1 < 100, a coluna Column1 correspondente da tabela de origem deverá ter a mesma restrição ou um subconjunto da restrição colocado nos valores na tabela de destino, como Column1 < 90 da tabela de origem. As restrições CHECK que especificam várias colunas devem ser definidas usando a mesma sintaxe.

  • Tabelas não particionadas devem ter as mesmas restrições da partição de destino. Se estiver adicionando uma tabela não particionada como uma partição a uma tabela particionada já existente, deverá haver uma restrição definida na coluna da tabela de origem correspondendo à chave de partição da tabela de destino. Isto garante que o intervalo de valores se ajuste aos valores limites da partição de destino.

  • Valores de limite da partição de origem devem estar dentro do limite da partição de destino. Se estiver alternando a partição de uma tabela particionada para outra tabela particionada, os valores limites da partição de origem devem ser ajustados aos valores limites da partição de destino. Se os valores limites não se ajustarem, deve haver uma restrição definida na chave de partição da tabela de origem para certificar-se de que todos os dados na tabela correspondam aos valores limites da partição de destino.

    Observação sobre cuidadosCuidado

    Evite a conversão de tipo de dados em definições de restrição. As restrições com conversão do tipo de dados implícita ou explicita definidas em tabelas que são a origem da alternância de partições podem fazer com que a operação ALTER TABLE...SWITCH falhe.

  • As tabelas de origem e de destino devem ter as mesmas restrições FOREIGN KEY. Se a tabela de destino tiver qualquer restrição FOREIGN KEY, a tabela de origem deve ter as mesmas chaves estrangeiras definidas nas colunas correspondentes e essas chaves estrangeiras devem fazer referência à mesma chave primária daquela da tabela de destino. As chaves estrangeiras da tabela de origem não podem ser marcadas como is_not_trusted (visível na exibição do catálogo sys.foreign_keys), a menos que a chave estrangeira correspondente na tabela de destino esteja também marcada como is_not_trusted. Para obter mais informações sobre essa configuração, consulte Diretrizes para desabilitar índices. O SQL Server aplica qualquer regra CASCADE definida em chaves estrangeiras da tabela de destino à partição recém-movida.

Requisitos adicionais por mover partições

Os requisitos de restrição adicionais a seguir devem também ser cumpridos para mover partições:

  • Os índices devem estar alinhados com as partições da tabela. Os índices na tabela de origem devem estar alinhados com a tabela de origem, os índice na tabela de destino devem estar alinhados com a tabela de destino. As tabelas de origem e de destino podem ser ambas particionadas, ou ambas não particionadas ou apenas uma das tabelas é particionada. Para obter mais informações sobre o alinhamento de índices, consulte Diretrizes especiais para índices particionados.

  • Restrições e requisitos adicionais se aplicam a tabelas de origem com exibições indexadas. Se a tabela de destino na instrução ALTER TABLE … SWITCH tiver uma exibição indexada definida, consulte Alternando partições quando exibições indexadas estão definidas para obter restrições e exemplos.

  • Nenhum índice de texto completo é permitido. Não pode haver nenhum índice de texto completo na tabela de origem ou na tabela de destino.

  • Nenhum índice XML é permitido na tabela de destino. Não pode haver nenhum índice XML na tabela de destino.

  • Não haverá chave primária/chaves estrangeiras definida(s) se a tabela de origem tiver a chave primária. Não pode haver nenhuma relação ativa de chave primária/chave estrangeira entre a tabela de origem e a tabela de destino na qual a tabela de origem contém a chave primária.

  • Não haverá chave primária/chaves estrangeiras definida(s) se a tabela de destino tiver a chave estrangeira. Não pode haver nenhuma relação ativa de chave primária/chave estrangeira entre a tabela de origem e a tabela de destino na qual a tabela de destino contém a chave estrangeira.

  • Nenhuma chave estrangeira de outra tabela poderá referenciar a tabela de origem. A tabela de origem não pode ser referenciada por uma chave estrangeira em outra tabela.

  • Regras a respeito das tabelas de origem ou de destino não são permitidas. Não pode haver nenhuma regra definida na tabela de origem ou na tabela de destino. Restrições CHECK podem ser usadas em tabelas de origem e de destino.

    ObservaçãoObservação

    As regras são um recurso de compatibilidade com versões anteriores. A implementação preferida é o uso das restrições CHECK. Para as restrições da restrição CHECK, consulte Requisitos de restrição já discutidos anteriormente nesse tópico.

  • As tabelas de origem e de destino não devem ser replicadas. Nem a tabela de origem nem a tabela de destino podem ser fontes de replicação.

  • Permissões para banco de dados devem ser obtidas antes da alternância de partição. Como a alternância da partição usa uma instrução ALTER TABLE, você deve ter as permissões de banco de dados necessárias associadas à instrução ALTER TABLE. O conjunto de permissões não deve ser o mesmo entre a tabela de origem e a tabela de destino.

  • Gatilhos não devem ser ativados enquanto estiver movendo partições. Nenhum gatilho INSERT, UPDATE ou DELETE ou ação em cascata será ativada pela movimentação de partições de tabelas. As tabelas de origem ou de destino não precisam de gatilhos definidos de forma semelhante para mover as partições.

    ObservaçãoObservação

    Durante a operação ALTER TABLE…SWITCH, um bloqueio para modificar esquema é obtido nas tabelas de origem e de destino para garantir que nenhuma outra conexão faça referência às tabelas durante a alteração. Para obter mais informações sobre bloqueios, consulte Modos de bloqueio.

Para mover partições de tabela