Um dos novos recursos do SQL Server 2012 codinome Denali
é o índice Columnstore.
Eu sei um pouco sobre índices regulares de armazenamento de linhas antigos, como a estrutura da árvore b, diferenças no armazenamento entre o nível da 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 informações boas sobre os internos de um índice columnstore.
- Como está estruturado?
- Existe uma árvore b? Alguma outra estrutura em vigor?
- 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, nenhuma ordem de chaves, nenhum campo incluído, APENAS não clusterizado.
Quaisquer insights são apreciados.
Respostas:
Estrutura Columnstore
Os dados do columnstore são fisicamente armazenados em um ou mais segmentos (unidades de alocação 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 os IDs de valor de dados do segmento sendo pesquisados no dicionário sempre que a execução exigir o valor real dos dados (essa pesquisa é adiada pelo maior tempo possível por motivos de desempenho).
Os segmentos também têm 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 a leitura das páginas de dados LOB do armazenamento físico completamente. Maximizar o potencial de eliminação pode exigir um design cuidadoso , incluindo uma dependência da ordem do índice em cluster no momento em que o índice Columnstore é criado.
Operadores de plano específico
O SQL Server 2012 apresenta um novo modo de execução chamado Modo de Lote. Nesse modo, pacotes de aproximadamente 1000 linhas são passados entre operadores, 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 exemplos daqueles que incluem Varredura de Índice Columnstore, Junção Interna de Hash, Construção de Tabela de Hash em Lote, Filtro de Bitmap, Agregado de Hash (agregados não escalares ), Filtro e Escalar de Computação (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.
Anti-Padrões
Há um grande número de restrições no primeiro release, 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 maior precisão de 18 dígitos,(N)VARCHAR(MAX)
,UNIQUEIDENTIFIER
, tipos CLR, e(VAR)BINARY
.Uso de tipos de cordas ,
OUTER JOIN
,IN
,EXISTS
,NOT IN
,OR
,UNION ALL
pode resultar num desempenho significativamente reduzido (Fila execução Mode), a menos que soluções alternativas são empregados que tipicamente envolvem reescritas de sintaxe incomuns tal como mostrado nos artigos ligados nesta secção.Mais Informações
Remus Rusanu publicou uma excelente visão geral aqui .
fonte