Eu tenho um índice armazenado em colunas clusterizado na tabela usada para log - apenas inserções (mas não inserções em massa). As estatísticas atuais da tabela são:
- 3541 milhões de linhas
- 6,6 GB de espaço reservado
Eu vejo esta manhã a seguinte operação via sp_whoisactive
:
ALTER INDEX [...] ON [...].[...]
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
Eu uso a seguinte consulta para verificar quantas linhas por row_group_id
nós temos:
SELECT
tables.name AS table_name,
indexes.name AS index_name,
partitions.partition_number,
dm_db_column_store_row_group_physical_stats.row_group_id,
dm_db_column_store_row_group_physical_stats.total_rows,
dm_db_column_store_row_group_physical_stats.deleted_rows,
dm_db_column_store_row_group_physical_stats.state_desc,
dm_db_column_store_row_group_physical_stats.trim_reason_desc
FROM sys.dm_db_column_store_row_group_physical_stats
INNER JOIN sys.indexes
ON indexes.index_id =
dm_db_column_store_row_group_physical_stats.index_id
AND indexes.object_id =
dm_db_column_store_row_group_physical_stats.object_id
INNER JOIN sys.tables
ON tables.object_id = indexes.object_id
INNER JOIN sys.partitions
ON partitions.partition_number =
dm_db_column_store_row_group_physical_stats.partition_number
AND partitions.index_id = indexes.index_id
AND partitions.object_id = tables.object_id
e 3383
remamos grupos com 1048576
linhas e poucos no final assim:
O problema é que estamos usando a edição padrão (no local) e a operação de reconstrução não é realizada online e causa muitos bloqueios.
Eu nunca vi tal questão antes. Algumas semanas atrás, atualizamos de SQL Server 2016 SP1
para SQL Server 2019
.
Minhas perguntas são:
- se apenas inserções forem aplicadas, deve ser a operação
reorganize
e ser mais rápida - caso contrário, se aplicarmos o particionamento, por exemplo, com base no ano, pois a tabela é usada para registro, o processo de automação reconstruirá apenas os dados da última partição
Você não deve nem se incomodar. Reorganize para um columnstore faz:
Considerações específicas para reorganizar um índice columnstore
Portanto, tudo o que ele fará é combinar os grupos de linhas abertos em um novo grupo de linhas compactado. Então, da próxima vez que você inserir qualquer coisa, você obterá novos rowgroups abertos. Portanto, não há nenhum benefício real em REORGANIZAR em seu cenário.
Como o JD aconselha, você pode particionar essa tabela se quiser aplicar a compactação de arquivamento apenas a partições mais antigas. Mas sua compressão já está muito boa.
A reorganização de seus índices sempre será mais rápida do que uma reconstrução completa e, normalmente, a diferença nos ganhos de desempenho de um em relação ao outro é mais rentável com a reorganização .
Se você usar Partitioning , poderá especificar quais partições deseja reconstruir e/ou reorganizar . O particionamento é uma boa solução para dividir grandes tabelas/índices para melhorar o desempenho com tarefas de manutenção em seus dados. Então, sim, você pode optar por reconstruir / reorganizar apenas a última partição ou agendar as partições que deseja manter em qualquer intervalo.
Não tenho certeza se quando você disse que tem "3541 milhões de linhas" você quis dizer 3,5 bilhões de linhas, porque 6,6 GB de espaço reservado é surpreendentemente pequeno para tantas linhas, mas na minha opinião quando você começa a ultrapassar cerca de meio bilhão de linhas em uma única tabela é quando o Particionamento pode ser uma boa opção de implementação.