Eu pensaria que essa seria uma pergunta bastante simples, mas realmente tive dificuldade em encontrar uma resposta para isso.
A pergunta: você pode mover linhas de dados dentro de uma tabela particionada de uma partição para outra, simplesmente atualizando a coluna da partição para que ela atravesse o limite da partição?
Por exemplo, se eu tiver uma tabela que tenha uma chave de partição:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
Com a função de partição que mapeia para a chave primária:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Posso mover uma linha da primeira partição para a terceira partição, alterando o SampleID de 1 para (digamos) 500.000?
Nota: estou marcando isso como sql server 2005 e 2008, pois ambos oferecem suporte ao particionamento. Eles lidam com isso de maneira diferente?
$PARTITION
calcula apenas o número da partição com base na entrada; na verdade, não testa onde a linha vive fisicamente.Para testar isso, o experimento realmente precisa particionar a tabela. Consulte http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
Consultar a função de particionamento apenas informa o que a função de particionamento diz. Não diz onde os dados estão armazenados. Você pode configurar uma função de particionamento e executá-la sem realmente particionar uma tabela, como já foi demonstrado aqui.
Para particionar a tabela, você também precisa criar grupos de arquivos e um esquema de particionamento que use a função de particionamento para atribuir resultados da função a grupos de arquivos. Então você deve colocar uma chave em cluster na tabela que usa esse esquema de particionamento.
Configure o particionamento
Não sou especialista em SQL de linha de comando. Usei a interface SSMS para configurar os grupos de arquivos pfg1 (com um arquivo pf1) e pfg2 (com um arquivo pf2). Então eu declarei a função e o esquema de particionamento:
Crie a tabela e o índice clusterizado
Depois de fazer isso, quando você consulta sys.partitions (eu tenho 2005), você vê que a tabela agora tem duas partições em vez de apenas uma para a tabela. Isso indica que implementamos totalmente o particionamento para esta tabela.
Agora que temos duas partições (com uma contagem de linhas para cada uma), podemos realizar um experimento.
Inserir as linhas
Verifique as partições sys. para ver o que aconteceu.
Sim. Uma linha em cada partição.
Mover uma linha.
Verifique as partições
A primeira partição agora tem duas linhas em vez de 1 e a segunda partição tem zero linhas em vez de duas.
Eu acho que isso confirma que a linha foi movida automaticamente como resultado da modificação da chave em cluster em uma tabela particionada.
fonte
Não acho que essa resposta esteja correta. Quando você usa o valor
você está simplesmente recalculando qual deve ser a partição, não onde está o registro atualmente.
Você deveria usar:
Nos meus testes no sql 2005, o valor muda, mas o registro permanece na mesma partição. Provavelmente, isso mexerá com as estatísticas e com o otimizador, pois ele será executado em um modo multiencadeado, esperando que uma partição esteja em um intervalo específico. Também estará completamente errado quando tentar usar a eliminação da partição para consultar apenas a partição relevante. Eu acho que você precisa excluir e reinserir cada registro para que eles se movam.
fonte
$partition
aqui sugere que a resposta aceita está correta. Como você está confirmando que o registro permanece na mesma partição após a atualização?