Qual é a anatomia de um índice columnstore?

20

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.

JNK
fonte
Há muita fanout sobre implementações técnicas de bancos de dados de armazenamento de colunas na página da wikipedia. Eu imagino que o índice seja apenas uma estrutura de dados de armazenamento de coluna para uma única coluna junto com suas chaves. Talvez ele use um índice de bitmap, talvez um BTree.
ConcernedOfTunbridgeWells
Na verdade, é para várias colunas. Também estou assumindo como com outras implementações SS que vai ser um pouco diferente do que outros produtos
JNK
Para o MySQL, mas o mesmo se aplica: developer.bazaarvoice.com/why-columns-are-cool Também o Sybase IQ é o avô
gbn
3
@ConcernedOfTunbridgeWells - Os índices columnstore usam índices de bitmap? Não. Os índices Columnstore usam uma representação de dados proprietária baseada no Vertipaq. Não é o mesmo que um índice de bitmap e não usa um. Mas possui alguns benefícios semelhantes aos índices de bitmap, como reduzir o tempo necessário para filtrar uma coluna com um pequeno número de valores distintos.
Martin Smith
11
Remus Rusanu, membro da equipe da Microsoft que desenvolveu esse recurso, acabou de publicar um artigo sobre o assunto: Por dentro dos índices COLUMNSTORE do SQL Server 2012
Nick Chammas

Respostas:

22

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 DECIMALcom 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 ALLpode 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 .

Paul White
fonte