Um dos novos recursos do SQL Server 2012 codinome Denali
é o índice Columnstore.
Eu sei um pouco sobre os índices antigos regulares de armazenamento de linha, como a estrutura da árvore b, diferenças no armazenamento entre o nível folha e as páginas da árvore b, efeitos dos campos incluídos, otimização para usá-los, ordem das chaves, etc.
Estou tendo dificuldade em obter boas informações sobre os componentes internos de um índice columnstore.
- Como é estruturado?
- Existe uma árvore b? Alguma outra estrutura no lugar?
- Como os dados são organizados?
- Que tipos de operadores específicos são mais adequados para usá-lo?
- Quaisquer outros antipadrões a serem evitados ao usá-los?
Muito do que posso descobrir sobre eles é basicamente o oposto exato de um índice "normal", ou seja, sem ordenação de chaves, sem campos incluídos, APENAS sem cluster.
Quaisquer insights são apreciados.
Estrutura da loja de colunas
Os dados do Columnstore são armazenados fisicamente em um ou mais segmentos (unidades de alocação de LOB regulares) por coluna e também podem ser particionados da maneira usual. Cada segmento contém aproximadamente um milhão de linhas de valores altamente compactados ou referências de valor (várias técnicas de compactação estão disponíveis). Uma referência de valor é vinculada a uma entrada em um de até dois dicionários de hash .
Os dicionários são fixados na memória durante a execução da consulta, com IDs de valor de dados do segmento sendo procurados no dicionário sempre que a execução exigir o valor de dados real (essa pesquisa é adiada pelo maior tempo possível por motivos de desempenho).
Os segmentos também possuem um registro de cabeçalho contendo metadados, como os valores mínimo e máximo armazenados no segmento. As informações do cabeçalho geralmente podem ser usadas para eliminar partições completas do processamento no tempo de execução. As informações do registro de cabeçalho são armazenadas na estrutura raiz de dados LOB usual, portanto, eliminar um segmento significa que o Mecanismo de armazenamento pode pular totalmente a leitura das páginas de dados LOB do armazenamento físico. Maximizar o potencial de eliminação pode exigir um design cuidadoso , incluindo uma dependência na ordem do índice clusterizado no momento em que o índice Columnstore é criado.
Operadoras de planos específicos
O SQL Server 2012 apresenta um novo modo de execução chamado Batch Mode. Nesse modo, pacotes de aproximadamente 1.000 linhas são passados entre as operadoras, melhorando significativamente a eficiência de utilização do processador. Dentro de cada pacote, os dados colunares são representados como um vetor. Nem todos os operadores de plano oferecem suporte à operação em modo de lote, mas os exemplos incluem Columnstore Index Scan, Hash Inner Join, Batch Hash Table Build, Bitmap Filter, Hash Aggregate (não agregados escalares ), Filter e Compute Scalar (para projeção e expressão avaliação). Os planos de execução de consulta foram aprimorados para mostrar o modo de execução estimado e real.
Antipadrões
Há um grande número de restrições no primeiro lançamento, incluindo restrições nos tipos de dados permitidos . Os tipos mais comuns são suportados; tipos de dados não suportados incluem
DECIMAL
com uma precisão maior que 18 dígitos,(N)VARCHAR(MAX)
,UNIQUEIDENTIFIER
, tipos CLR e(VAR)BINARY
.O uso de tipos de cadeia de caracteres ,
OUTER JOIN
,IN
,EXISTS
,NOT IN
,OR
,UNION ALL
pode resultar em desempenho significativamente reduzido (execução no modo de linha), a menos que sejam empregadas soluções alternativas que normalmente envolvam reescritas de sintaxe incomuns, conforme mostrado nos artigos vinculados nesta seção.Mais Informações
Remus Rusanu postou uma ótima visão geral aqui .