Estou trabalhando com índices columnstore clusterizados no SQL Server e tenho uma dúvida sobre como manter a ordem dos dados.
Entendo que, por padrão, os índices columnstore clusterizados não classificam os dados. Eu vi uma técnica em que as pessoas:
- Crie um índice rowstore clusterizado para classificar os dados
- Em seguida, use a opção DROP_EXISTING para criar um índice columnstore clusterizado. Isso resulta em um índice columnstore clusterizado com dados inicialmente classificados.
No entanto, estou preocupado com o que acontece quando novos dados são inseridos.
Minhas perguntas são:
- A inserção de novos dados nesta tabela perturba a ordem existente?
- Em caso afirmativo, há alguma maneira de evitar isso ou manter a ordem ao longo do tempo?
Eu apreciaria insights de qualquer pessoa que tenha experiência com esse cenário ou conhecimento sobre o funcionamento interno dos índices columnstore no SQL Server. Agradecemos antecipadamente pela sua ajuda!
Primeiro de tudo, você não precisa de um pedido, o que você realmente precisa é alinhar (não sobrepor) os valores mínimo e máximo para um campo na tabela para que o SQL Server possa executar a eliminação do segmento sem realmente abri-lo e a maneira de conseguir isso é classificar conteúdo do índice columnstore clusterizado.
Sim, é verdade. Existem dois modos de inserção de dados - lotes grandes em que a inserção vai diretamente para o grupo de linhas e inserção pequena (ou mesmo de linha única), para que a inserção vá para o deltastore. Assim que o deltastore atingir o limite, ele será movido para o estado fechado e o movedor de tupla o converterá em rowgroup. Este rowgroup pode ter valores mínimo e máximo não alinhados, portanto será verificado sempre. Além disso, o movedor de tuplas pode combinar grupos de linhas pequenos com um maior, modificando os valores mínimo e máximo para que esse grupo de linhas não seja eliminado.
Não apenas insira ordem de interrupção. A atualização é implementada como delete+insert no deltastore, portanto fará o mesmo.
Você não pode evitar isso, mas se você pensa em reconstruir o índice para restaurar a ordem de classificação, você está errado. https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver16#rebuild--with--rebuild_index_option---n- --
A única maneira de realmente classificar os dados é o truque que você descreveu.
No SQL 2022 existe uma opção ORDER que deve ajudar o sql server a manter o pedido, não tive oportunidade de testar porém houve reclamações.
O que mais você poderia fazer?
Você pode dividir a tabela em partição estática e ativa e não tocar na partição estática.
Você pode usar visualizações de particionamento para unir todas as tabelas estáticas e ativas. Usando essa abordagem, você pode misturar tabelas columnstore e rowstore, pode criar índices diferentes para tabelas ativas e somente leitura.
Que estratégia você deve usar para manutenção?
A Microsoft não fornece nenhuma medida de segmentos não alinhados. A única métrica que eles fornecem é a fragmentação
Eu gostaria de ter 'práticas recomendadas' para reconstruir ou reorganizar o índice columnstore.