Eu pensaria que esta seria uma pergunta bastante simples, mas na verdade 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 cruze o limite da partição?
Por exemplo, se eu tiver uma tabela com 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, já que ambos suportam particionamento. Eles lidam com isso de forma diferente?
Não tenho um servidor 2005 para testar. 2008, no entanto, parece lidar com isso como esperado:
Você deve ver um registro em cada partição antes da atualização e ambos os registros na primeira partição depois.
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 sã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 de função a grupos de arquivos. Então você tem que 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 do SSMS para configurar os grupos de arquivos pfg1 (com um arquivo pf1) e pfg2 (com um arquivo pf2). Em seguida, declarei a função e o esquema de particionamento:
Crie a tabela e o índice clusterizado
Depois de fazer isso, ao consultar sys.partitions (eu tenho 2005), você verá 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), podemos realizar um experimento.
Insira as linhas
Verifique o sys.partitions para ver o que aconteceu.
Sim. Uma linha em cada partição.
Mova 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.
Acho que isso confirma que a linha foi movida automaticamente como resultado da modificação da chave agrupada em uma tabela particionada.
Post antigo mas muito útil!!
Eu provei que ele se move no SQL Server 2017 truncando a partição 2 após a atualização e o registro ainda está lá na partição 1
Não acho que essa resposta esteja correta. Quando você usa o valor
você está simplesmente recalculando qual deveria ser a partição, não onde o registro está atualmente.
Você deveria usar:
Nos meus testes no sql 2005 o valor muda mas o registro fica na mesma partição. Isso provavelmente irá 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 de partição para consultar apenas a partição relevante. Acho que você precisa excluir e reinserir cada registro para movê-los.