É um
select * from myView
mais rápido que a própria consulta para criar a visualização (para obter o mesmo resultado definido):
select * from ([query to create same resultSet as myView])
?
Não está totalmente claro para mim se a exibição usa algum tipo de cache, tornando-a mais rápida em comparação com uma consulta simples.
sql
sql-server
performance
JohnIdol
fonte
fonte
Respostas:
Sim , as visualizações podem ter um índice clusterizado atribuído e, quando o fazem, armazenam resultados temporários que podem acelerar as consultas resultantes.
Atualização: Pelo menos três pessoas votaram em mim nessa. Com todo o respeito, acho que eles estão errados; A documentação da própria Microsoft deixa muito claro que o Views pode melhorar o desempenho.
Primeiro, as visualizações simples são expandidas e, portanto, não contribuem diretamente para as melhorias de desempenho - isso é verdade. No entanto, as exibições indexadas podem melhorar drasticamente o desempenho.
Deixe-me ir diretamente para a documentação:
Segundo, essas visualizações indexadas podem funcionar mesmo quando não são diretamente referenciadas por outra consulta, pois o otimizador as utilizará no lugar de uma referência de tabela quando apropriado.
Mais uma vez, a documentação:
Esta documentação, bem como gráficos demonstrando melhorias de desempenho, pode ser encontrada 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 "Visualização". No entanto, isso é facilmente refutado.
Digamos que somos uma empresa de software em um país pequeno; Vou usar a Lituânia como exemplo. Vendemos software em todo o mundo e mantemos nossos registros em um banco de dados do SQL Server. Temos muito sucesso e, em alguns 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. Ao criar uma exibição indexada apenas dos registros lituanos, mantemos os registros necessários em um cache indexado, conforme descrito na documentação da MS. Quando geramos nossos relatórios de vendas da Lituânia em 2008, nossa consulta pesquisará um índice com profundidade de apenas 7 (Log2 (100) com algumas folhas não utilizadas). Se fizéssemos o mesmo sem o VIEW e apenas contássemos um índice na tabela, teríamos que percorrer uma árvore de índices com uma profundidade de pesquisa de 21!
Claramente, o próprio View nos proporcionaria uma vantagem de desempenho (3x) sobre o simples uso do índice sozinho. Tentei usar um exemplo do mundo real, mas você observará que uma simples lista 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 árvore b, não conheço os detalhes. No entanto, o argumento é válido.
Atualização 3: Surgiu a pergunta 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 a uma exibição". Se isso fosse verdade, é claro, 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:
Juntamente com a citação acima, referente à persistência de dados no armazenamento físico e outras informações na documentação sobre como os índices são criados no Views, acho seguro dizer que um Modo de Exibição Indexado não é apenas um SQL Select em cache que usa um índice definido na tabela principal. Assim, continuo apoiando esta resposta.
fonte
De um modo geral, não. As visualizações são usadas principalmente por conveniência e segurança e não produzem (por si mesmas) nenhum benefício de velocidade.
Dito isto, o SQL Server 2000 e versões posteriores têm um recurso chamado Exibições Indexadas que podem melhorar bastante o desempenho, com algumas ressalvas:
COUNT
,MIN
,MAX
, ouTOP
.Este artigo descreve benefícios e limitações adicionais de visualizações indexadas :
fonte
No SQL Server, pelo menos, os planos de consulta são armazenados no cache do plano para visualizações e consultas SQL comuns, com base em parâmetros de consulta / exibição. Para ambos, eles são descartados do cache quando não são utilizados por um período suficientemente longo e o espaço é necessário para alguma outra consulta recém-enviada. Depois disso, se a mesma consulta for emitida, ela será recompilada e o plano será colocado novamente no cache. Portanto, não, não há diferença, pois você está reutilizando a mesma consulta SQL e a mesma exibição com a mesma frequência.
Obviamente, em geral, uma visão, por sua própria natureza (que alguém pensou que deveria ser usada com frequência suficiente para torná-la uma visão), geralmente tem mais chances de ser "reutilizada" do que qualquer instrução SQL arbitrária.
fonte
Edição: Eu estava errado, e você deve ver Marks responder acima.
Não posso falar por experiência própria com o SQL Server , mas para a maioria dos bancos de dados a resposta seria não. O único benefício potencial que você obtém, em termos de desempenho, ao usar uma exibição é que ela pode criar alguns caminhos de acesso com base na consulta. Mas o principal motivo para usar uma exibição é simplificar uma consulta ou padronizar uma maneira de acessar alguns dados em uma tabela. De um modo geral, você não terá um benefício de desempenho. Eu posso estar errado, no entanto.
Gostaria de apresentar um exemplo moderadamente mais complicado e cronometrar você mesmo para ver.
fonte
Pode ser mais rápido se você criar uma vista materializada ( com ligação de esquema ). As visualizações não materializadas são executadas exatamente como a consulta regular.
fonte
Meu entendimento é que, um tempo atrás, uma exibição seria mais rápida porque o SQL Server poderia armazenar um plano de execução e apenas usá-lo em vez de tentar descobrir um em tempo real. Eu acho que os ganhos de desempenho hoje em dia provavelmente não são tão bons quanto antes, mas eu teria que adivinhar que haveria alguma melhoria marginal para usar a exibição.
fonte
Definitivamente, uma exibição é melhor que uma consulta aninhada para o SQL Server. Sem saber exatamente por que é melhor (até ler a postagem de Mark Brittingham), eu havia executado alguns testes e experimentado melhorias de desempenho quase chocantes ao usar uma exibição versus uma consulta aninhada. Depois de executar cada versão da consulta várias centenas de vezes seguidas, a versão de exibição da consulta foi concluída na metade do tempo. Eu diria que isso é prova suficiente para mim.
fonte
Eu esperaria que as duas consultas fossem executadas de forma idêntica. Uma visão nada mais é do que uma definição de consulta armazenada, não há armazenamento em cache ou armazenamento de dados para uma visão. O otimizador transformará efetivamente sua primeira consulta na sua segunda consulta quando você a executar.
fonte
Tudo depende da situação. As exibições indexadas do MS SQL são mais rápidas que uma exibição ou consulta normal, mas as exibições indexadas não podem ser usadas em um ambiente de banco de dados espelhado (MS SQL).
Uma visualização em qualquer tipo de loop causará séria desaceleração, pois a visualização é preenchida novamente toda vez que é chamada no loop. O mesmo que uma consulta. Nessa situação, uma tabela temporária usando # ou @ para reter seus dados é mais rápida que uma exibição ou uma consulta.
Então, tudo depende da situação.
fonte
Não há diferenças práticas e, se você ler BOL, descobrirá que sempre que seu SQL SELECT * FROM X antigo se aproveita do cache do plano etc.
fonte
Deve haver algum ganho trivial em manter o plano de execução armazenado, mas será insignificante.
fonte
O objetivo de uma exibição é usar a consulta repetidamente. Para esse fim, o SQL Server, Oracle etc. geralmente fornecerão uma versão "em cache" ou "compilada" da sua exibição, melhorando assim seu desempenho. Em geral, isso deve ter um desempenho melhor do que uma consulta "simples", embora, se a consulta for realmente muito simples, os benefícios possam ser insignificantes.
Agora, se você estiver fazendo uma consulta complexa, crie a exibição.
fonte
Na minha conclusão, o uso da visualização é um pouco mais rápido que uma consulta normal. Meu procedimento armazenado demorou cerca de 25 minutos (trabalhando com conjuntos de registros maiores diferentes e várias junções) e, depois de usar a exibição (sem cluster), o desempenho foi um pouco mais rápido, mas não significativo. Eu tive que usar algumas outras técnicas / método de otimização de consulta para fazer uma mudança drástica.
fonte
Selecionar em uma Visualização ou em uma tabela não fará muito sentido.
Obviamente, se o View não possui junções, campos etc. desnecessários, você pode verificar o plano de execução de suas consultas, junções e índices usados para melhorar o desempenho do View.
Você pode até criar um índice nas visualizações para requisitos de pesquisa mais rápidos. http://technet.microsoft.com/en-us/library/cc917715.aspx
Mas se você estiver pesquisando como '% ...%' que o mecanismo sql, não se beneficiará de um índice na coluna de texto. Se você pode forçar seus usuários a fazer pesquisas como '...%', isso será rápido
referida resposta em fóruns asp: https://forums.asp.net/t/1697933.aspx?Which+is+faster+when+using+SELECT+query+VIEW+or+Table+
fonte
Contra todas as expectativas, as visualizações são muito mais lentas em algumas circunstâncias.
Descobri isso recentemente quando tive problemas com dados extraídos do Oracle que precisavam ser massageados em outro formato. Talvez 20k linhas de origem. Uma mesinha Para fazer isso, importamos os dados do oracle o mais inalterável possível para uma tabela e, em seguida, usamos visualizações para extrair dados. Tivemos visões secundárias com base nessas visões. Talvez 3-4 níveis de visualizações.
Uma das consultas finais, que extraiu talvez 200 linhas, levaria mais de 45 minutos! Essa consulta foi baseada em uma cascata de visualizações. Talvez 3-4 níveis de profundidade.
Eu poderia pegar cada uma das visualizações em questão, inserir seu sql em uma consulta aninhada e executá-la em alguns segundos.
Descobrimos até que poderíamos gravar cada visualização em uma tabela temporária e consultá-la no lugar da visualização e ainda era muito mais rápido do que simplesmente usar visualizações aninhadas.
O mais estranho foi que o desempenho foi bom até atingirmos um limite de linhas de origem sendo arrastadas para o banco de dados, os desempenhos acabaram de cair de um penhasco no espaço de alguns dias - foram necessárias mais algumas linhas de origem.
Portanto, o uso de consultas extraídas de visualizações que são extraídas de visualizações é muito mais lento que uma consulta aninhada - o que não faz sentido para mim.
fonte
Passei por esse tópico e só queria compartilhar esta postagem de Brent Ozar como algo a considerar ao usar grupos de disponibilidade.
Relatório de bug do Brent Ozar
fonte