Fala pessoal, no post de hoje vou falar sobre como podemos criar um índice em uma view dentro do SQL Server.
Em muitos casos a utilização de views pode se tornar um problema de performance, principalmente quando falamos de views que são usadas em JOINs e leem tabelas gigantescas.
O objetivo da criação de índices em uma view é melhorar a sua performance, porém existem alguns pontos que devem ser levados em consideração:
1) O primeiro índice deve ser um Exclusivo Clustered (UNIQUE CLUSTERED), isso fará a view ser tratada como uma tabela normal sendo armazenada no banco como uma tabela.
2) Não é recomendado criar um índice para uma view que lê dados de tabelas que sofrem muita modificação o tempo todo, o tempo de processamento das alterações dos dados ou até mesmo inserção será afetado pois como a view passa a ser salva como tabela, o esforço será dobrado.
3) A definição de uma exibição indexada deve ser determinística. Uma exibição será determinística se todas as expressões na lista selecionada, bem como as cláusulas WHERE e GROUP BY, forem determinísticas. Elas sempre retornam o mesmo resultado sempre que são avaliadas com um conjunto específico de valores de entrada.
Para criar uma view indexada existem alguns requisitos, destaco:
a) As tabelas devem ser referenciadas pelo nome do schema e da tabela (schema.tablename)
b) Deve-se usar a clausula WITH SCHEMABINDING para criar a view
c) Se for utilizar a clausula GROUP BY, o objeto deverá conter COUNT_BIG(*) e não deverá conter HAVING.
d) Se usar GROUP BY, a chave do índice UNIQUE CLUSTERED só poderá referenciar as colunas especificadas na cláusula GROUP BY.
Vamos colocar a mão na massa!
Criada view no modelo tradicional, realizando JOIN entre duas tabelas.
Habilitando STATISTICS IO, podemos analisar o número de leituras de páginas ao realizar um select na view.
Podemos tentar a criação dos índices de todas as formas (como se fosse uma tabela), porém iremos esbarrar nesse mesmo erro. No exemplo tento criar um índice clustered exclusivo, na sequência um clustered não exclusivo e por fim um índice do tipo nonclustered.
Isso ocorre porque na view faltava um dos requisitos que falamos mais acima. Recriamos com a opção WITH SCHEMABINDING.
E então podemos criar o primeiro índice (UNIQUE CLUSTERED)
Ao conferir novamente o número de leituras de páginas já com o índice criado podemos observar que o número reduziu. As 150 leituras que eram realizadas em PersonPhone diminuíram para apenas 3 e foram somadas com as leituras da tabela Person.
O índice criado pode ser conferido pelo SP_HELPINDEX e também é possível verificar no plano de execução que o SQL Server utiliza-o para executar a query
Essa funcionalidade em views é muito útil mas deve ser utilizada com cautela, não é qualquer situação que você deve usar, como DBA avalie principalmente se não irá resolver problemas de leituras e acabar piorando o desempenho de escrita (lembre-se ao indexar uma view ela passa a ser armazenada como uma tabela).
Nos acompanhe em nossas redes sociais!
Youtube(vídeos novos todas as quartas): https://www.youtube.com/channel/UChFeqc-m7HZNdkoP0CshMGQ
Face & Instagram(conteúdo diário): dba on boarding
Até a próxima, tchau!
Comments