Índices columnstore descritos

O SQL Server índice columnstore na memória armazena e gerencia dados usando o armazenamento de dados baseado em coluna e o processamento de consulta baseado em coluna. Os índices columnstore funcionam bem para as cargas de trabalho de data warehouse que executam principalmente carregamentos em massa e consultas somente leitura. Use o índice columnstore para obter um ganho de desempenho de consulta até 10 vezes maior sobre o armazenamento tradicional orientado por linha e de compactação de dados até 7 vezes maior sobre o tamanho dos dados não compactados.

Note

Vemos o índice columnstore clusterizado como o padrão para armazenar tabelas de fatos de armazenamento de dados grandes e esperamos que ele seja usado na maioria dos cenários de data warehousing. Como o índice columnstore clusterizado é atualizável, sua carga de trabalho pode executar um grande número de operações de inserção, atualização e exclusão.

Conteúdos

Basics

Um índice columnstore é uma tecnologia para armazenar, recuperar e gerenciar dados usando um formato de dados columnar, chamado columnstore. SQL Server dá suporte a índices columnstore clusterizados e não clusterizados. Ambos usam a mesma tecnologia columnstore na memória, mas têm diferenças de finalidade e recursos compatíveis.

Benefits

Os índices Columnstore funcionam bem para consultas somente leitura que executam análises em grandes conjuntos de dados. Geralmente, essas são consultas para cargas de trabalho de armazenamento de dados. Os índices Columnstore proporcionam ganhos de alto desempenho para consultas que usam verificações de tabela completas e não são adequados para consultas que buscam os dados, procurando um valor específico.

Benefícios do Índice Columnstore:

  • As colunas geralmente têm dados semelhantes, o que resulta em altas taxas de compactação.

  • As altas taxas de compactação melhoram o desempenho da consulta usando um volume de memória menor. Por sua vez, o desempenho da consulta pode melhorar porque SQL Server pode executar mais operações de consulta e dados na memória.

  • Um novo mecanismo de execução de consulta chamado execução em modo de lote foi adicionado a SQL Server que reduz o uso da CPU em uma grande quantidade. A execução em modo de lote é intimamente integrada e otimizada em torno do formato de armazenamento columnstore. Às vezes, a execução em modo de lote é conhecida como execução vetor ou vetorizada.

  • Muitas vezes, as consultas selecionam apenas algumas colunas de uma tabela, o que reduz a E/S total da mídia física.

Versões do Columnstore

SQL Server 2012, SQL Server 2012 Parallel Data Warehouse e SQL Server 2014 usam índices columnstore para acelerar consultas comuns data warehouse. SQL Server 2012 introduziu dois novos recursos: um índice columnstore não clusterizado e uma funcionalidade de execução de consulta baseada em vetor que processa dados em unidades chamadas "lotes". SQL Server 2014 tem os recursos de SQL Server 2012 mais índices columnstore clusterizados atualizáveis.

Características principais

Aplica-se a: SQL Server 2014 a SQL Server 2019 (15.x).

No SQL Server, um índice columnstore clusterizado:

  • Está disponível nas edições Enterprise, Developer e Evaluation.

  • É atualizável.

  • É o método de armazenamento primário para toda a tabela.

  • Não tem colunas de chave. Todas as colunas são incluídas em colunas.

  • É o único índice na tabela. Não pode ser combinado com outros índices.

  • Pode ser configurado para usar a compactação de arquivamento columnstore ou columnstore.

  • Não armazena fisicamente colunas em uma ordem classificada. Em vez disso, armazena dados para melhorar a compactação e o desempenho.

Aplica-se a: SQL Server 2012 a SQL Server 2019 (15.x).

No SQL Server, um índice columnstore não clusterizado:

  • Pode indexar um subconjunto de colunas no índice clusterizado ou heap. Por exemplo, ele pode indexar as colunas usadas com frequência.

  • Requer armazenamento extra para armazenar uma cópia das colunas no índice.

  • É atualizado recriando o índice ou alternando partições para dentro e para fora. Ele não é atualizável usando as operações DML, como inserir, atualizar e excluir.

  • Pode ser combinado com outros índices na tabela.

  • Pode ser configurado para usar a compactação de arquivamento columnstore ou columnstore.

  • Não armazena fisicamente colunas em uma ordem classificada. Em vez disso, armazena dados para melhorar a compactação e o desempenho. Pré-classificar os dados antes de criar o índice columnstore não é necessário, mas pode melhorar a compactação columnstore.

Principais conceitos e termos

Os termos e conceitos principais a seguir estão associados aos índices columnstore.

índice columnstore Um índice columnstore é uma tecnologia para armazenar, recuperar e gerenciar dados usando um formato de dados columnar, chamado columnstore. SQL Server dá suporte a índices columnstore clusterizados e não clusterizados. Ambos usam a mesma tecnologia columnstore na memória, mas têm diferenças de finalidade e recursos compatíveis.

columnstore Um columnstore são dados que são logicamente organizados como uma tabela com linhas e colunas e armazenados fisicamente em um formato de dados em termos de coluna.

rowstore Um rowstore são dados que são logicamente organizados como uma tabela com linhas e colunas e armazenados fisicamente em um formato de dados em linha. Essa tem sido a maneira tradicional de armazenar dados de tabela relacional.

rowgroups e segmentos de coluna Para alto desempenho e altas taxas de compactação, o índice columnstore corta a tabela em grupos de linhas, chamados de grupos de linhas e compacta cada grupo de linhas de maneira em termos de coluna. O número de linhas no grupo de linhas deve ser grande o suficiente para melhorar as taxas de compactação e pequeno o suficiente para se beneficiar de operações na memória.

O grupo de linhas A é um grupo de linhas compactadas no formato columnstore ao mesmo tempo.

segmento de coluna um segmento de coluna é uma coluna de dados de dentro do rowgroup.

  • Um rowgroup geralmente contém o número máximo de linhas por rowgroup, que é de 1.048.576 linhas.

  • Cada rowgroup contém um segmento de coluna para cada coluna na tabela.

  • Cada segmento de coluna é compactado e armazenado em meio físico.

Segmento coluna coluna

índice columnstore não clusterizado Um índice columnstore não clusterizado é um índice somente leitura criado em um índice clusterizado existente ou tabela heap. Ele contém uma cópia de um subconjunto de colunas, até e incluindo todas as colunas na tabela. A tabela é somente leitura enquanto contém um índice columnstore não clusterizado.

Um índice columnstore não clusterizado fornece uma maneira de ter um índice columnstore para executar consultas de análise e, ao mesmo tempo, executar operações somente leitura na tabela original.

Índice columnstore não clusterizado

índice columnstore clusterizado Um índice columnstore clusterizado é o armazenamento físico de toda a tabela e é o único índice para a tabela. O índice clusterizado é atualizável. Você pode executar operações de inserção, exclusão e atualização no índice e pode carregar dados em massa no índice.

Índice Columnstore Clusterizado de Índice

Para reduzir a fragmentação dos segmentos de coluna e melhorar o desempenho, o índice columnstore pode armazenar alguns dados temporariamente em uma tabela rowstore, chamada deltastore, além de uma Árvore B de IDs para linhas excluídas. As operações de deltastore são realizadas em segundo plano. Para retornar os resultados corretos da consulta, o índice columnstore clusterizado combina os resultados da consulta de columnstore e deltastore.

deltastore Usado apenas com índices columnstore clusterizados, um deltastore é uma tabela rowstore que armazena linhas até que o número de linhas seja grande o suficiente para ser movido para o columnstore. Um deltastore é usado com índices columnstore clusterizados para melhorar o desempenho do carregamento e de outras operações DML.

Durante o carregamento em massa grande, a maioria das linhas vai diretamente para o columnstore sem passar pelo deltastore. Algumas linhas no final da carga em massa podem ser muito poucas em número para atender ao tamanho mínimo de um rowgroup que é de 102.400 linhas. Quando isso acontece, as linhas finais vão para o deltastore em vez do columnstore. Para carregamentos em massa pequenos com menos de 102.400 linhas, todas as linhas vão diretamente para o deltastore.

Quando o deltastore atinge o número máximo de linhas, ele fica fechado. Um processo de movimentação de tupla verifica se há grupos de linhas fechadas. Quando encontra o rowgroup fechado, ele o compacta e o armazena no columnstore.

Carregamento de dados

Carregando dados em um índice Columnstore não clusterizado

Para carregar dados em um índice columnstore não clusterizado, primeiro carregue os dados em uma tabela rowstore tradicional armazenada como um heap ou índice clusterizado e crie o índice columnstore não clusterizado com CREATE COLUMNSTORE INDEX (Transact-SQL).

Carregando dados em um índice columnstore

Uma tabela com um índice columnstore não clusterizado é somente leitura até que o índice seja descartado ou desabilitado. Para atualizar a tabela e o índice columnstore não clusterizado, você pode alternar as partições para dentro e para fora. Você também pode desabilitar o índice, atualizar a tabela e recompilar o índice.

Para obter mais informações, consulte Como usar índices Columnstore não clusterizados

Carregando dados em um índice Columnstore clusterizado

Carregando em um índice columnstore clusterizado

Como o diagrama sugere, para carregar dados em um índice columnstore clusterizado, SQL Server:

  1. Insere rowgroups de tamanho máximo diretamente no columnstore. À medida que os dados são carregados, SQL Server atribui as linhas de dados em uma ordem de primeiro saque por ordem de primeiro serviço em um rowgroup aberto.

  2. Para cada rowgroup, depois de atingir o tamanho máximo, SQL Server:

    1. Marca o rowgroup como CLOSED.

    2. Ignora o deltastore.

    3. Compacta cada segmento de coluna com o rowgroup com compactação columnstore.

    4. Armazena fisicamente cada segmento de coluna compactada no columnstore.

  3. Insere as linhas restantes no columnstore ou no deltastore da seguinte maneira:

    1. Se o número de linhas atender ao requisito mínimo de linhas por rowgroup, as linhas serão adicionadas ao columnstore.

    2. Se o número de linhas for menor que as linhas mínimas por rowgroup, as linhas serão adicionadas ao deltastore.

Para obter mais informações sobre tarefas e processos deltastore, consulte Usando índices Columnstore clusterizados

Dicas de desempenho

Planejar memória suficiente para criar índices columnstore em paralelo

Criar um índice columnstore é, por padrão, uma operação paralela, a menos que a memória seja restrita. Criar o índice em paralelo exige mais memória do que criar o índice em série. Quando há memória suficiente, a criação de um índice columnstore leva cerca de 1,5 vez mais tempo do que a criação de um índice B-tree sobre as mesmas colunas.

A memória necessária para criar um índice columnstore depende do número de colunas, do número de colunas de cadeia de caracteres, do grau de paralelismo (DOP) e as características dos dados. Por exemplo, se a tabela tiver menos de um milhão de linhas, SQL Server usará apenas um thread para criar o índice columnstore.

Se sua tabela tiver mais de um milhão de linhas, mas SQL Server não conseguir uma concessão de memória grande o suficiente para criar o índice usando MAXDOP, SQL Server diminuirá automaticamente MAXDOP conforme necessário para se ajustar à concessão de memória disponível. Em alguns casos, o DOP deve ser reduzido para 1 para criar o índice sob restrição de memória.

Índices Columnstore não clusterizados

Para tarefas comuns, consulte Como usar índices Columnstore não clusterizados.

Índices columnstore clusterizados

Para tarefas comuns, consulte Como usar índices Columnstore clusterizados.

Metadata

Todas as colunas em um índice columnstore são armazenadas nos metadados como colunas incluídas. O índice columnstore não tem colunas de chave.