Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Uma visualização é mais rápida do que uma consulta simples?


Sim , visualizações podem têm um índice clusterizado atribuído e, quando o fazem, armazenam resultados temporários que podem acelerar as consultas resultantes.

A própria documentação da Microsoft deixa bem claro que o Views pode melhorar o desempenho.

Primeiro, a maioria das visualizações que as pessoas criam são simples visualizações e não usam esse recurso e, portanto, não são diferentes de consultar as tabelas base diretamente. As visualizações simples são expandidas no local e, portanto, não contribuem diretamente para melhorias de desempenho - isso é verdade. No entanto, visualizações indexadas podem dramaticamente melhorar o desempenho.

Deixe-me ir diretamente para a documentação:

Depois que um índice clusterizado exclusivo é criado na exibição, o conjunto de resultados da exibição é materializado imediatamente e persistido no armazenamento físico no banco de dados, economizando a sobrecarga de realizar essa operação cara em tempo de execução.

Segundo, essas visualizações indexadas podem funcionar mesmo quando não são referenciadas diretamente por outra consulta pois o otimizador irá usá-los no lugar de uma referência de tabela quando apropriado.

Novamente, a documentação:

A exibição indexada pode ser usada em uma execução de consulta de duas maneiras. A consulta pode fazer referência à exibição indexada diretamente ou, mais importante, o otimizador de consulta pode selecionar a exibição se determinar que a exibição pode ser substituída por algumas ou todas as consultas no plano de consulta de custo mais baixo. No segundo caso, a exibição indexada é usada em vez das tabelas subjacentes e seus índices comuns. A exibição não precisa ser referenciada na consulta para que o otimizador de consulta a use durante a execução da consulta. Isso permite que os aplicativos existentes se beneficiem das exibições indexadas recém-criadas sem alterar esses aplicativos.

Esta documentação, bem como os gráficos que demonstram as melhorias de desempenho, podem ser encontrados aqui.

Atualização 2: a resposta foi criticada com base no fato de que é o "índice" que fornece a vantagem de desempenho, não a "Visão". No entanto, isso é facilmente refutado.

Digamos que somos uma empresa de software em um pequeno país; Vou usar a Lituânia como exemplo. Vendemos software em todo o mundo e mantemos nossos registros em um banco de dados SQL Server. Temos muito sucesso e, em poucos anos, temos mais de 1.000.000 de registros. No entanto, muitas vezes precisamos relatar vendas para fins fiscais e descobrimos que vendemos apenas 100 cópias de nosso software em nosso país de origem. Ao criar uma exibição indexada apenas dos registros lituanos, podemos manter os registros necessários em um cache indexado, conforme descrito na documentação do MS. Quando executarmos nossos relatórios de vendas na Lituânia em 2008, nossa consulta pesquisará em um índice com profundidade de apenas 7 (Log2(100) com algumas folhas não utilizadas). Se fôssemos fazer o mesmo sem a VIEW e apenas confiar em um índice na tabela, teríamos que percorrer uma árvore de índice com uma profundidade de pesquisa de 21!

Claramente, a própria View nos forneceria uma vantagem de desempenho (3x) sobre o simples uso do índice sozinho. Tentei usar um exemplo do mundo real, mas você notará que uma lista simples de vendas da Lituânia nos daria uma vantagem ainda maior.

Observe que estou apenas usando uma árvore b reta para o meu exemplo. Embora eu tenha quase certeza de que o SQL Server usa alguma variante de uma b-tree, não conheço os detalhes. No entanto, o ponto se mantém.

Atualização 3: A questão surgiu sobre se uma exibição indexada usa apenas um índice colocado na tabela subjacente. Ou seja, parafraseando:"uma exibição indexada é apenas o equivalente a um índice padrão e não oferece nada de novo ou exclusivo para uma exibição". Se isso fosse verdade, é claro, então a análise acima estaria incorreta! Deixe-me fornecer uma citação da documentação da Microsoft que demonstra por que acho que essa crítica não é válida ou verdadeira:

Usar índices para melhorar o desempenho da consulta não é um conceito novo; no entanto, exibições indexadas fornecem benefícios de desempenho adicionais que não podem ser alcançados usando índices padrão.

Juntamente com a citação acima sobre a persistência de dados no armazenamento físico e outras informações na documentação sobre como os índices são criados nas visualizações, acho seguro dizer que uma visualização indexada não apenas um SQL Select em cache que usa um índice definido na tabela principal. Assim, continuo a defender esta resposta.