Conhecendo o Microsoft SQL Server 2012 e 2014 – Utilizando o ColumnStored Index.

Salve, Salve Comunidade! Tudo bem?

Após um período de diversos eventos que participei e realizei desde Março deste ano, até a última semana, consegui um pouco de tempo para poder compartilhar com vocês, mais um pouquinho sobre o Fantástico Mundo que forma o Microsoft SQL Server, que neste momento se encontra em destaque com o lançamento da nova versão denonimada 2014.

Dentre as diversas inovações que normalmente uma nova versão apresenta, eu vou destacar hoje com você um recurso que foi criado e implementado na versão 2012 mas que apresentou um grande evolução neste nova versão. Estou me referindo ao ColumnStore Index, ou simplesmente, Índice armazenado em Coluna, numa tradução bem comum.

Como de costume foi fazer uma pequena introdução sobre este recursos e no decorrer deste artigo, destacarei:

  • Pontos Positivos e Negativos;

 

 

  • Considerações;

 

 

  • Restrições;

 

 

  • Cenários de Uso; e

 

 

  • Códigos de exemplo.

 

 

Então boa leitura e Lets Go!!!

Introdução ao ColumnStore Index

Implementado no Microsoft SQL Server 2012 desde as primeiras versões disponibilizadas para comunidade, o ColumnStore Index foi apresentado como um dos maiores recursos e inovações do SQL Server 2012, principalmente no quesito de performance para se trabalhar com grandes volumes de dados, algo muito desejado por todos aqueles que trabalham com SQL Server, mas que entendiam que era um ponto a ser investido e tratado pela Microsoft.

Através do ColumnStore Index a Microsoft, possibilitou ao mercado de Banco de Dados e Data Warehouse, o uso de tecnologia considerada inovadora na forma de tratar os dados que estão armazenados em tabelas em bases relacionais e tabelas fatos em ambientes de Data Warehouse.

O funcionamento do ColumnStore Index

Com base, no novo algoritmo de processamento de dados chamado de xVelocity, o Microsoft SQL Server a partir da versão 2012, permite que suas consultas sejam processadas com um ganho de desempenho para padrões de alto nível com grandes volumes de dados, este um recurso que permite aumentar a velocidade das consultas em até 100% dentro de tabelas fatos em um Data Warehouse.

Vindo da tecnologia VertiPaq o ColumnStore Index, recurso que esta vinculado ao xVelocity, permite a transformação das páginas de dados em colunas, onde cada página de dados é acessada independentemente, fazendo com que a compressão seja muito mais efetiva.

Outro fator importante consiste no novo modo interno de busca de dados chamado Batch Mode, que estabelece e permite uma busca de dados nas colunas de forma mais ágil, inteligente, sendo realizado em blocos de 1000 em 1000 registros, possibilitando uma maior velocidade na busca de dados.

Nas versões anteriores do Microsoft SQL Server, os dados eram armazenados em modo de linhas, como também em tabelas Heaps e Índice em estrutura de armazenamento no formato B-Tree. Com o ColumnStore Index, este cenário muda, estes mesmos dados podem ter um maior aproveitamento, onde os valores são armazenados em modo coluna, sendo as colunas que formam o respectivo índice, conforme apresenta a Figura 1.

ColumnStoreIndex1

Figura 1 – Forma de armazenamento de dados utilizados no ColumnStore Index em comparação a forma normal realizada por Tabelas e Índices.

Como qualquer outro recurso e tecnologia o ColumnStore Index, também possui algumas características e comportamentos, dentre os quais destaco:

Pontos Positivos

A seguir apresento os principais Pontos Positivos existentes para o ColumnStore Index:

  • Batch Mode = Blocos de 1.000 linhas que são retornados a consulta ao ínves de linha-a-linha;

 

 

  • Algoritmo de Redução de Custo de I/O, tornando a consulta assim mais eficiente; e

 

 

  • “Segment  Elimination” de acordo com os filtros passados ao Query Optimizer, possibilitará trazer a consulta mais rápido, isso porque o mecanismo possibilita a quebra da partição em diversas partes selecionando assim os dados de uma forma mais eficiente.

 

 

Pontos Negativos

A seguir apresento alguns elementos considerados Pontos Negativos para em relalção ao ColumnStore Index:

  • Ao criar um ColumnStored Index no SQL Server 2012, a tabela se torna “Read-Only”, não podendo ser permitido operações de DML tais como: INSERT/UPDATE/DELETE e MERGE. Sendo assim só é possivel alterá-la se o ColumnsStore Index for desabilitada ou excluída no Microsoft SQL Server 2012. No Microsoft SQL Server 2014 esta limitação foi contornado, onde podemos criar ColumnStore Index no Clustered que permitem alteração e manipulação;

 

 

  • Algumas operações não são possíveis no novo modo “Batch Mode” como: Outer Joins, Join entre strings, NOT IN, IN, EXISTS e agregações escalares;

 

 

  • Se houver pressão na memória ou um grande uso de paralelismo, provavelmente o Query Optimizer utilizirá o modo linha-a-linha para a execução da consulta; e

 

 

  • Somente nas edições Enterprise, Standard e Developer é possível criar índices do tipo ColumnStore Index.

 

 

Considerações

A seguir apresento a relação de Considerações aplicadas ao ColumnStore Index:

  • Tabelas contendo milhões a bilhões de registros (Fact Tables) representam cenários mais indicados para se trabalhar com o ColumnStore Index;

 

 

  • O ColumnStore Indexes não suporta operações de Seek, somente Scan;

 

 

  • Operações de agregação como SUM(), AVG, joins e filtros utilizados na pesquisa;

 

 

  • Os índices podem ser criados em uma tabela temporária. Quando a tabela for removida ou a sessão encerrada, os índices serão removidos;

 

 

Os tipos de dados corporativos comuns podem ser incluídos em um índice columnstore, sendo eles:

 

  • char e varchar;

 

 

  • nchar e nvarchar (exceto varchar(max) e nvarchar(max));

 

 

  • decimal (e numeric) (exceto com precisão maior que 18 dígitos.);

 

 

  • int , bigint, smallint e tinyint;

 

 

  • float (e real);

 

 

  • Bit; e

 

 

  • money e smallmoney.

 

 

Observação: Todos os tipos de dados de data e hora (exceto datetimeoffset com escala maior que 2) podem ser utilizado.

Por outro lado, existem vários tipos de dados que não podem ser utilizados com ColumnStore Index, sendo eles:

 

  • binary e varbinary;

 

 

  • ntext , text e image;

 

 

  • varchar(max) e nvarchar(max);

 

 

  • Uniqueidentifier;

 

 

  • rowversion (e timestamp);

 

 

  • sql_variant ;

 

 

  • decimal (e numeric) com precisão maior que 18 dígitos;

 

 

  • datetimeoffset com escala maior que 2; e

 

 

  • Tipos CLR (hierarchyid e tipos espaciais).

 

 

Restrições

A seguir apresento a relação de Restrições existentes para o ColumnStore Index:

  • Não pode ter mais de 1024 colunas;

 

 

  • Apenas índices columnstore não clusterizados estão disponíveis, até a versão 2012. Na versão 2014 esta limitação foi removida, permitindo a utilização de ColumnStore Index, com base, em índices Clustered, permitindo a realizações de comandos de manipulação de Dados, sem necessitar que a tabela fique em “Read-Only”.

 

 

  • Não pode ser um índice exclusivo;

 

 

  • Não pode ser criado em uma exibição ou exibição indexada;

 

 

  • Não pode incluir uma coluna esparsa;

 

 

  • Não pode atuar como uma chave primária ou estrangeira;

 

 

  • Não pode ser alterado por meio da instrução ALTER INDEX. Em vez disso, remova e recrie o índice columnstore. Você pode usar ALTER INDEX para desabilitar e recriar um índice columnstore;

 

 

  • Não pode ser criado por meio da palavra-chave INCLUDE; e

 

 

  • Não pode incluir as palavras-chave ASC ou DESC para classificar o índice. Os índices columnstore são ordenados de acordo com os algoritmos de compactação. A classificação eliminará muitos dos benefícios de desempenho.

 

 

Índices ColumnStore não podem ser combinados com os recursos a seguir:

 

  • Compactação de página e de linha, e formato de armazenamento vardecimal (um índice columnstore já foi compactado em um formato diferente);

 

 

  • Replicação;

 

 

  • Controle de alterações;

 

 

  • Change Data Capture; e

 

 

  • Fluxo de arquivos.

 

 

Agora que já conhecemos mais sobre o ColumnStore Index, vamos começar a trabalhar com o mesmo, para isso utilizaremos os Bloco de Código apresentado abaixo, seguindo o passo a passo:

— Passo 1 — Criando o Banco de Registros ColumnStoreIndex —

CREATEDATABASEColumnStoreIndex

Go

— Passo 1.1 — Acessando o Banco de Registros ColumnStoreIndex —

UseColumnStoreIndex

Go

— Passo 2 — Criando uma nova Sequência de Valores —

CREATESEQUENCESeqAsINT— Tipo

STARTWITH 1 — Valor Inicial (1)

INCREMENTBY 1 — Avança de um em um

MINVALUE 1 — Valor mínimo 1

MAXVALUE 100000 — Valor máximo 100000

CACHE 1000 — Mantém 1000 posições em cache

NOCYCLE— Não irá reciclar

Go

— Passo 3 — Criando a Tabela Registros com Primary Key —

CreateTableRegistros

(DescricaoVarChar(60)NotNull,

ValorFloatNull,

DateDateDefaultGetDate(),

TimeTimeDefaultGetDate())

Go

AlterTableRegistros

AddConstraint[PK_Registros]PrimaryKeyClustered (Descricao)On[Primary]

Go

— Passo 3.1 — Criando um Índice NonClustered para Tabela Registros —

CREATENONCLUSTEREDINDEX [IND_Registros_NonClustered]

ON Registros

(Descricao, Valor,Date,Time)

Go

— Passo 4 — Listando a Relação de Índices da Tabela dbo.Registros —

Execsp_helpindex‘Registros’

Go

— Passo 5 — Inserindo a Massa de Registros —

InsertIntoRegistros(Descricao,Valor)

Values (‘Ola…’+Convert(Varchar(100),Rand()),Rand())

Go 10000

No Passo 6, realizaremos a execução do primeiro Select para buscar dados na Tabela Registros em conjunto com o Plano de Execução, conforme apresentam a Figura 2 e Figura 3:

— Passo 6 — Executando o Select em conjunto com Sequence e Verificar o Plano de Execução —

SelectNextValueforSeqAsCodigo,Descricao,Valor,Date,TimefromRegistros

Go

ColumnStoreIndex2

Figura 2 – Resultado do Plano de Execução apresentado após o Passo 6 ser executado.

ColumnStoreIndex3

 

 

Figura 3: Indicadores de execução utilizados pelo operadores Index Scan, na Tabela Registro, sendo que, este operador consumiu 98% do custo de processamento da query executado na Passo 6.

Galera, até aqui nada de novo tirando o objeto Sequence chamado Seq, que criamos no Passo 2, como um recurso para criar um seqüenciador(incremento) de valores utilizado como mecanismo de numeração dos registros que estão sendo inseridos em nossa Tabela. Vale ressaltar que este numerador esta sendo gerado durante o processamento do comando Select.

— Passo 7 — Limpando o Cache de Execução – Procedure e Buffer —

DBCCDROPCLEANBUFFERS

DBCCFREEPROCCACHE

Go

Você pode estar se perguntando o porquê, estamos fazendo a Limpeza do Cache de Execução existente neste momento no SQL Server. Na verdade isso não é obrigatório, decidi fazer uso deste procedimento para garantir e demonstrar que não existe nada residente em memória e que o SQL Server deverá criar novos planos para as transações que estarão sendo processadas.

Observações

  • Use DBCC FREEPROCCACHE para limpar o cache do plano cuidadosamente. Por exemplo, liberar o cache do plano faz com que um procedimento armazenado seja recompilado em vez de reutilizado no cache.Isso pode causar uma diminuição súbita e temporária no desempenho de consulta.

 

 

  • Para cada armazenamento em cache limpo no cache do plano, o log de erros do SQL Server conterá a seguinte mensagem informativa: “O SQL Server encontrou %d ocorrência(s) de liberação de armazenamento em cache ‘% s’ (parte do cache do plano) devido às operações ‘DBCC FREEPROCCACHE’ ou ‘DBCC FREESYSTEMCACHE'”. Essa mensagem é registrada a cada cinco minutos, desde que o cache seja liberado dentro desse intervalo de tempo.

 

 

O próximo passo será realizar a criação do ColumnStore Index, chamado ColumnStoreIndex_Registros, conforme apresenta a Figura 4:

— Passo 8 — Criando o ColumnStore Index —

CREATENONCLUSTEREDCOLUMNSTOREINDEXColumnStoreIndex_Registros

ONdbo.Registros

(

Descricao,

Valor,

Date,

Time

)

Go

ColumnStoreIndex4

Figura 4: Relação de Índices existentes na Tabela Registros, incluindo o ColumnStore Index.

Pois bem, para ilustrar nosso cenário, vamos fazer a ativação das Estatíticas de Time e IO para utilizarmos como indicadores de comparação quando estivermos ou não fazendo uso do ColumnStore Index, para isso executaremos o Passo 9.

— Passo 9 — Ativando as Estatísticas de Time e IO —

SETSTATISTICSTIMEON

SETSTATISTICSIOON

Go

Muito bem, estatísticas ativas, a partir de agora nossas transações terão o controle de tempo de I/O sendo apresentadas em tela como indicadores ou medidores de desempenho. Nosso próximo passo é executar o Passo 10 e Passo 11, observando as diferenças apresentada entre os Planos de Execução.

— Passo 10 — Executando novamente o Select com ColumnStore Index e Verificar o Plano de Execução —

SelectNextValueforSeqAsCodigo,Descricao,Valor,Date,TimefromRegistros

Go

— Passo 11 — Executando novamente o Select ignorando o ColumnStore Index e Verificar o Plano de Execução —

SelectNextValueforSeqAsCodigo,Descricao,Valor,DatefromRegistros

OPTION (IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX);

Go

Neste momento podemos realizar a execução do Passos 10 e 11, em seguida poderemos observar o resultado deste processamento, com base, nos operadores e custo de processamento de cada operador apresentado pelo Plano de Execução. Então vamos nessa, hora de executar os próximos passos e conferir o seu resultado apresentado abaixo na Figura 5.

ColumnStoreIndex5

Figura 5: Resultado apresentado pelo Plano de Execução, no momento do processamento dos Passos 10 e 11.

Podemos facilmente notar que o custo de Processamento do Passo 10, que faz uso do nosso ColumnStore Index foi de 27%, sendo que, o operador ColumnStore Index Scan, consumiu 98% de processamento. Em contra partida o Passo 11, consumiu 73% do custo de processamento, onde 99% deste processamento foi consumido pelo operador Index Scan.

Entendo que neste momento, você já pode ter entendido e observado como o ColumnStore Index pode fazer diferença, principalmente quando estamos fazendo uma consulta de dados, os demais passos vou deixar como complemento, na verdade com passos adicionais para representar outros cenários de comparação e uso do ColumnStore Index em relação a Tabelas e Índices.

— Passo 12 — Executando novamente o Select + Group By com ColumnStore Index e Verificar o Plano de Execução —

SelectNextValueforSeqAsCodigo,Descricao,Valor,Date,Count(Time)AsContagemfromRegistros

GroupByDescricao,Valor,Date

Go

— Passo 13 — Executando novamente o Select + Group By ignorando o ColumnStore Index e Verificar o Plano de Execução —

SelectNextValueforSeqAsCodigo,Descricao,Valor,Date,Count(Time)AsContagemfromRegistros

GroupByDescricao,Valor,Date

OPTION (IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX);

Go

— Passo 14 — Desativando as Estatísticas de Time e IO —

SETSTATISTICSTIMEOFF

SETSTATISTICSIOOFF

Go

Finish!!!

Conclusão

O ColumnStore Index, com certeza representa uma evolução nos recursos e tecnologias de bancos de dados relacional criada para se trabalhar com grandes volumes de dados, a maneira com que os dados são armazenados no ColumnStore Index nos permitem conseguir um ganho de performance de maneira perceptível e satisfatória.

As vantagens que este tipo de recurso pode apresentar são inúmeras, desde o processo de configuração até mesma a forma de uso, que possibilita ao SQL Server adaptar-se no momento da execução da transação que esta fazendo a consulta dos dados.

Espero que o material apresentado neste artigo possa ser útil e colabore com suas atividades, vou continuar testando novos recursos presentes no Microsoft SQL Server 2012 que foram melhorados na versão 2014.

Mais uma vez obrigado, nos encontramos em breve.

Até mais.

Autor: Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação pela Uninove - Campus São Roque. Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP - Faculdade de Informática e Administração Paulista de São Paulo. Pós-Graduado em Gestão da Tecnologia da Informação Faculdade - ESAMC Sorocaba. Cursando Mestrado em Ciências da Computação - UFSCar - Campus - Sorocaba. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1995 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator - Administrador de Banco de Dados - SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, Triggers. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping, para versões: 2000, 2005, 2008, 2008 R2, 2012 e 2014. Atualmente trabalho como Administrador de Banco de Dados no FIT - Instituto de Tecnologia da Flextronics, como também, Consultor em Projetos de Tunnig e Performance para clientes. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Possuo titulação Oficial Microsoft MVP - SQL Server renovada desde 2007.

3 comentários em “Conhecendo o Microsoft SQL Server 2012 e 2014 – Utilizando o ColumnStored Index.”

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s