faz toda a diferença).

Introdução a Índices

Antes de entrarmos no assunto de views indexadas é necessário conhecermos um pouco sobre índices. No BOL – Books Online (o help do SQL Server) encontramos a seguinte definição para índice: é uma estrutura associada com uma tabela ou view que acelera a recuperação das linhas da tabela ou view. Portanto, um índice é algo que acelera nossos SELECT’s, sendo de vital importância para o desempenho das bases de dados. Uma maneira muito simples, e interessante, para entendermos como um índice funciona é fazermos uma correlação com um livro. Imaginemos que você tem em mãos um catálogo telefônico e que deseja localizar a página onde se encontra o nome José da Silva. Você tem duas maneiras de fazer isso: a primeira é ir varrendo as páginas do catálogo, com o esforço de olhar página por página até encontrar o nome José da Silva; a segunda é consultar o índice disponível no início do catálogo e, a partir da informação contida no índice, ir diretamente para a página onde se encontram os nomes que começam com a letra J. É evidente que a segunda maneira é mais rápida! Quando uma tabela possui índices o SQL Server pode então utilizá-los para atender mais rapidamente as consultas.

No SQL Server existe os seguintes tipos de índices:

  • Clustered
  • Nonclustered
  • XML
  • Spatial
  • Full-Text Search
  • Column Store (introduzido no SQL Server 2012)

Alguns autores costumam citar, ainda, índices filtrados como um tipo de índice, mas, pessoalmente, prefiro considerar isso apenas como uma opção para índices Clustered ou Nonclustered. ATENÇÃO: vale destacar que o assunto de Índices não é cobrado diretamente pela grade de conteúdos da prova 70-461, mas deter o mínimo de conhecimento sobre esse assunto poderá ajudar na resolução de algumas questões. Para o tópico que estamos focando neste post, bastará entendermos o que são índices Clustered e Nonclustered.

Quando criamos um índice clustered em uma determinada tabela então as linhas de dados, daquela tabela, são fisicamente armazenadas e ordenadas conforme a chave que compõe o índice. Nota: vale esclarecer que a chave de um índice é constituída de uma ou mais colunas da tabela. Por exemplo, a chave do índice XPTA é a coluna CPF da tabela PESSOA; a chave do índice XPTO são as colunas CNPJ e DATA_COMPRA da tabela COMPRA. Como o índice clustered afeta a ordem física em que as linhas de dados são armazenadas, então só é possível termos um índice clustered por tabela. Uma tabela que possui índice clustered é conhecida como tabela clusterizada. Uma tabela sem índice clustered é conhecida como tabela heap (Heap Table).

Um índice nonclustered não afeta a ordem física em que as linhas da tabela são armazenadas. Ele é uma estrutura auxiliar, separada das linhas de dados da tabela. Na versão 2012 do SQL Server é possível criarmos até 999 índices Nonclustered (não recomendo ninguém cometer tamanha loucura em ambientes OLTP!).

Segue a sintaxe resumida para criação de índices Clustered / Nonclustered:

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”Q1JFQVRFIFtVTklRVUVdIE5PTkNMVVNURVJFRCBJTkRFWCBOb21lRG9JbmRpY2UKT04gVGFiZWxhWFlaIChDb2x1bmFBLCBDb2x1bmFCKTsKCkNSRUFURSBbVU5JUVVFXSBDTFVTVEVSRUQgSU5ERVggTm9tZURvSW5kaWNlCk9OIFRhYmVsYVhZWiAoQ29sdW5hQSk7″ hover_enabled=”0″]Q1JFQVRFIFtVTklRVUVdIE5PTkNMVVNURVJFRCBJTkRFWCBOb21lRG9JbmRpY2UKT04gVGFiZWxhWFlaIChDb2x1bmFBLCBDb2x1bmFCKTsKCkNSRUFURSBbVU5JUVVFXSBDTFVTVEVSRUQgSU5ERVggTm9tZURvSW5kaWNlCk9OIFRhYmVsYVhZWiAoQ29sdW5hQSk7[/et_pb_dmb_code_snippet]

A expressão UNIQUE, que está entre colchetes e que é opcional, indica se o índice é único, ou seja, se o valor da chave pode ou não ser repetido no decorrer das linhas. Quando UNIQUE é omitido durante a criação então o índice não tem valor exclusivo para a chave. Perceba que a diferença na sintaxe é basicamente o uso das palavras Clustered e Nonclustered.

Views Indexadas (Indexed Views)

Como já foi comentado anteriormente, é possível criarmos índices em views, apesar de o mais usual ser a criação de índices em tabelas. Contudo, ao contrário das tabelas, o primeiro índice a ser criado obrigatoriamente em uma view é um índice do tipo Unique Clustered e a partir daí, opcionalmente, criarmos índices Nonclustered conforme necessidade.

Uma pergunta para testar a sua leitura até aqui: é possível criar um índice Nonclustered em uma view que ainda não possua índice Clustered? NÃO, não é possível.

Quando criamos um índice Unique Clustered sobre uma view o SQL Server irá “materializar” aquela view. Neste caso, o SQL Server cria uma estrutura interna que armazena o resultado (result set) da view, exatamente como se fosse uma tabela com índice clustered. Você pode pensar nessa estrutura como um tipo especial de tabela cujo esquema (colunas) é definido pela instrução SELECT da view. Uma view que possui índice Unique Clustered é conhecida como View Indexada(em outros SGDBs você encontra conceito equivalente como Views Materializadas).

Mas por que usar views indexadas? Quais os benefícios?Imagine aquela view com vários JOIN’S e agregações, referenciando tabelas de vários milhões de linhas. Uma view indexada pode, nesse cenário, acelerar, e muito, as consultas, pois, como os dados já estão persistidos numa estrutura separada, o SQL Server não precisará acessar várias tabelas, aplicar várias agregações, etc. Pelo contrário, bastará ao SQL Server resgatar as linhas diretamente na view indexada. Evidentemente que não existe almoço grátis. Existe um trade-off que precisa ser considerado antes de sairmos por aí criando views indexadas. É necessário balancear o benefício que teremos ao acelerar as consultas contra o custo na modificação de dados. Uma view indexada causa impacto sobre as modificações de dados nas tabelas referenciadas pela view. Toda vez que fizermos um INSERT / UPDATE / DELETE em alguma tabela que é referenciada por uma view indexada, o SQL Servir precisará também replicar a modificação na view indexada. Assim, um INSERT, por exemplo, acontecerá em dois lugares: uma vez na tabela e outra na view indexada.

Criação

Na criação de views indexadas é obrigatório que:

  • Usemos a opção WITH SCHEMABINDING;
  • Criemos o índice clustered como unique.

Agora vamos alterar a view vwProdutos, criada em post anterior desta série, tornando-a numa view indexada. O primeiro passo é alterar a view e incluir a opção SCHEMABINDING.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”VVNFIERCRXhhbWU3MDQ2MQpHTwoKQUxURVIgVklFVyB2d1Byb2R1dG9zCldJVEggU0NIRU1BQklORElORwpBUwoKU0VMRUNUIHAuSUQgLCBwLk5vbWUgQVMgUHJvZHV0bywgcC5DYXRlZ29yaWFJRApGUk9NIGRiby5Qcm9kdXRvIHAKd2hlcmUgcC5DYXRlZ29yaWFJRCA9IDIKR08=” hover_enabled=”0″]VVNFIERCRXhhbWU3MDQ2MQpHTwoKQUxURVIgVklFVyB2d1Byb2R1dG9zCldJVEggU0NIRU1BQklORElORwpBUwoKU0VMRUNUIHAuSUQgLCBwLk5vbWUgQVMgUHJvZHV0bywgcC5DYXRlZ29yaWFJRApGUk9NIGRiby5Qcm9kdXRvIHAKd2hlcmUgcC5DYXRlZ29yaWFJRCA9IDIKR08=[/et_pb_dmb_code_snippet]

Agora vamos criar um unique índice clustered.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”Y3JlYXRlIHVuaXF1ZSBjbHVzdGVyZWQgaW5kZXggdndQcm9kdXRvc19JRApPTiBkYm8udndQcm9kdXRvcyAoSUQpOw==” hover_enabled=”0″]Y3JlYXRlIHVuaXF1ZSBjbHVzdGVyZWQgaW5kZXggdndQcm9kdXRvc19JRApPTiBkYm8udndQcm9kdXRvcyAoSUQpOw==[/et_pb_dmb_code_snippet]

Veja que o índice é unique. É muito importante não esquecer esse detalhe.

Conclusão

A criação de views indexadas é simples, vez que basta incluir a opção SCHEMABINDING na sintaxe e criar um índice unique clustered na view. É vital estarmos atentos a esses detalhes, pois é quase certo que você encontre na prova 70-461 pelo menos uma questão abordando views indexadas.