As tabelas indexadas de armazenamento de colunas agrupadas em geral são úteis para tabelas grandes. Idealmente com milhões de linhas. E também útil com consultas, que selecionam apenas o subconjunto de colunas disponíveis em tais tabelas.
O que acontece se quebrarmos essas duas "regras"/melhores práticas?
- Como ter uma tabela indexada de armazenamento de colunas em cluster que armazenará apenas alguns milhares ou centenas de milhares de linhas no máximo.
- E executando consultas naquela tabela de armazenamento de colunas em cluster onde todas as colunas são necessárias.
Meus testes não revelam nenhuma degradação de desempenho em comparação com a tabela de índice clusterizado armazenada em linha. O que é ótimo no nosso caso.
Existe algum efeito de "longo prazo" que infrinja essas duas regras? Ou alguma armadilha escondida que ainda não apareceu?
Contexto por que é necessário: Eu projetei um modelo de banco de dados que será usado para muitas instâncias de bancos de dados de fornecedores diferentes. O esquema permanece o mesmo em todos os bancos de dados, mas diferentes fornecedores têm diferentes quantidades de dados. Assim, alguns pequenos fornecedores podem acabar com uma pequena quantidade de dados (<1.000.000) em suas tabelas. Não posso me permitir manter dois bancos de dados diferentes para o modelo de armazenamento de linha e armazenamento de coluna.
O índice Columnstore tem uma grande vantagem no tamanho dos dados compactados. O objetivo geral do índice Columnstore é ler rapidamente um monte de dados devido à sua compactação.
CCI é índice agrupado de Columnstore, agrupado é índice agrupado
O Columnstore Index compacta o tamanho dos dados de 4 MB para 2 MB.
Podemos olhar para o desempenho em duas tabelas e três partes.
A primeira é a
SELECT
operação mínima:Resultado : Há uma
Columnstore Scan
estimativa aqui e errada. Além disso, a diferença de leitura lógica. Você pode dizer que não importa para você, mas, se você usar uma consulta SELECT mínima, provavelmente usará milhares de vezes. E isso afetará o desempenho total.A segunda é a
UPDATE
operação mínima:Resultado : Existem diferenças de leitura, CPU e tempo, como podemos ver.
A terceira é a
REBUILD
operação:Se eu reconstruir e atualizar todas as linhas para fragmentação de índice, verei um índice de armazenamento de colunas clusterizado mais fragmentado do que o índice clusterizado. E eu não mostrei, mas o
Clustered Columnstore Index
processo de reconstrução produz log de transações mais deClustered Index
.Como diz o documento
Se você tiver uma tabela pequena, não precisará indexar Columnstore.
Para @YunusUYANIK apontar para as possíveis quedas de projetar seu esquema atendendo apenas a um lado, por que não criar índices rowstore e columnstore em sua tabela atendendo adequadamente a ambos os cenários? Claro que você pode acabar indexando os mesmos campos nos dois sentidos, mas a principal desvantagem seria apenas o aumento do uso do espaço de armazenamento, que geralmente é muito menos preocupante ao planejar o desempenho.
Dependerá do seu esquema e da quantidade de dados em suas tabelas para cada fornecedor, portanto, você terá que testar para garantir que o design dos índices esteja sendo usado nas consultas apropriadas para as diferentes quantidades de dados com base nos predicados do fornecedor . Na pior das hipóteses, você pode ter que usar dicas de índice às vezes também, mas acho que se você projetar os dois tipos de índices corretamente, isso não é muito provável.