Eu tenho uma IMO de tabela extremamente grande (~ 137 milhões de linhas) com muitos dados repetidos, muitas NULL
colunas e assim por diante .
Estou pensando em explorar isso usando uma tabela com COLUMNSTORE INDEX
ae tenho uma IDENTITY
coluna na tabela original, que é minha única coluna em que cada linha é única.
Devo deixar esta coluna de fora ou incluí-la? Li que você deseja incluir todas as linhas da sua tabela no, COLUMNSTORE INDEX
mas também li que os melhores candidatos são colunas com muitas linhas não exclusivas.
Este é apenas um candidato ruim para um COLUMNSTORE INDEX
?
Estou usando o SQL Server 2012, por isso é um columnstore não clusterizado. Estou apenas explorando possíveis maneiras melhores de armazenar esses dados. As atualizações são inexistentes, embora novas linhas sejam adicionadas periodicamente por meio de um processo ELT, portanto, estou assumindo que algum trabalho seria feito lá. Algumas pessoas extraem esses dados e geram relatórios enormes, muitas varreduras de linhas, levando o servidor a rastrear às vezes, o que nos forçou a descarregar uma cópia diariamente para um servidor secundário.
137 million rows
é grande, mas gerenciável. Você já pensou em particionar a tabela e colocá-la em diferentes grupos de arquivos? O índice Columnsstore no sql 2012 não pode ser gravado, portanto você terá problemas - é necessário eliminá-lo e recriá-lo. Não estou dizendo que o columnstore será ruim, mas é melhor explorar outras opções também.Respostas:
As colunas de identidade não são realmente compactadas nos índices Columnstore no SQL Server 2012 ou no SQL Server 2014. Tudo depende verdadeiramente da carga de trabalho que você está enfrentando. Se sua carga de trabalho incluir a coluna de identidade, você poderá aproveitar muito bem a eliminação do segmento.
Do ponto de vista da compactação - o Columnstore fornecerá uma compactação melhor do que a página normalmente oferece. Tipicamente. Teste-o antes de avançar para a produção.
Seu maior problema no SQL Server 2012 será uma implementação muito fraca do Modo de Lote, e não há nada que você possa fazer sobre isso.
fonte
Não pude resistir em juntar-me ao Niko com outra resposta (bem-vindo, Niko!). Em geral, concordo com Niko que as limitações do modo de lote no SQL 2012 (se o Niko não criar um link para seu próprio blog, eu irei :)) podem ser uma grande preocupação. Mas se você pode conviver com eles e ter controle total sobre todas as consultas que está escrevendo na tabela para examiná-las cuidadosamente, o columnstore pode funcionar para você no SQL 2012.
No que diz respeito às suas perguntas específicas sobre a coluna de identidade, descobri que a coluna de identidade é muito compacta e recomendo incluí-la no seu índice columnstore em qualquer teste inicial. (Observe que se a coluna de identidade também for o índice em cluster da sua árvore b, ela será automaticamente incluída no índice columnstore não em cluster ).
Para referência, aqui estão os tamanhos que observei para ~ 10MM linhas de dados da coluna de identidade. O columnstore carregado para a eliminação ideal do segmento é compactado em 26 MB (vs. 113 MB para
PAGE
compactação da tabela rowstore), e até o columnstore construído em uma b-tree ordenada aleatoriamente tem apenas 40 MB. Portanto, isso mostra um enorme benefício de compactação, mesmo com a melhor compactação de árvore b que o SQL tem a oferecer e mesmo que você não se preocupe em alinhar seus dados para a eliminação ideal do segmento (o que você faria primeiro criando uma árvore b e depois construindo seu columnstore comMAXDOP
1).Aqui está o script completo que eu usei, caso você queira brincar:
fonte