No SQL Server 2008 R2, estou explorando o uso de tabelas de particionamento.
Temos um esquema de exclusão reversível que às vezes é um IsDeleted bit NOT NULL
e às vezes umDateDeleted date NULL
Quero focar no primeiro caso, o bit.
Estou pensando em particionar esta tabela no bit porque a tabela quase sempre é consultada e unida incluindo esta coluna.
Como eu faria esse processo? É uma má ideia?
Primeiro tentei percorrer o assistente, mas o script gerado para mim parecia estranho (várias quedas de restrições, criação de um novo CI)
A seguir está um script de amostra que acabei de criar que mostra como criar uma tabela que contém um
IsDeleted
campo.Depois que a tabela é criada e preenchida com 10.000 linhas, adiciono uma função e um esquema de particionamento e alguns grupos de arquivos e arquivos para conter as partições. Na vida real, você gostaria de criar esses grupos de arquivos e arquivos em LUNs dedicados para aproveitar as E/S extras e a restauração fragmentada.
Em seguida, altero a tabela para que ela use a função de particionamento, movendo assim as linhas existentes para o grupo de arquivos apropriado. Como você não pode executar um 'ALTER TABLE...ALTER CONSTRAINT` para alterar a chave primária para usar a função de particionamento, você é forçado a descartar a chave primária e recriá-la com a nova função de particionamento. Isso significa que o índice clusterizado será transformado em um heap até que você possa criar o novo índice clusterizado com a função de particionamento.
Acabei de executar isso e obtive os seguintes resultados:
Como você pode ver, a tabela tinha uma distribuição quase perfeita de linhas no estado
IsDeleted = 0
andIsDeleted = 1
. A atualização de uma linha de 0 para 1 resultou na movimentação da linha para a outra partição.Espero que isso ajude a mostrar como alterar uma tabela para aproveitar o particionamento em um campo
IsDeleted
de exclusãoBIT
reversível.Quando executei o assistente para particionar esta tabela, com a opção de script para uma nova janela de consulta, obtive este código:
Tanto quanto eu posso dizer, este código parece que não funciona. Ele descarta o PK e o recria, sem usar a função de particionamento. Em seguida, ele cria um índice clusterizado, usando a função de particionamento, mas o descarta imediatamente!
A coluna de particionamento deve estar no índice de agrupamento. Portanto, se o valor de IsDeleted mudar, a linha deverá se mover de um bit do disco para outro. Se sua intenção ao usar o sinalizador era adiar o custo de E/S da exclusão executando um UPDATE em vez de um DELETE, essa solução é contraproducente. Com ele você estará realizando tanto um DELETE (do local atual da linha) quanto um INSERT para seu novo local. Se a intenção era isolar os dados do arquivo, você é um vencedor. Sugiro que você também use índices filtrados na parte ativa de sua tabela.