Resolvendo índices em exibições

Como com qualquer índice, o SQL Server escolhe usar uma exibição indexada em seu plano de consulta apenas se o otimizador de consulta determinar que isso é benéfico.

Podem ser criadas exibições indexadas em qualquer edição do SQL Server. No SQL Server Enterprise Edition, o otimizador de consulta considera a exibição indexada automaticamente. Para usar uma exibição indexada em todas as outras edições, deve ser usada a dica de tabela NOEXPAND.

O otimizador de consulta SQL Server usa uma exibição indexada quando as seguintes condições são atendidas:

  • Estas opções de sessão são definidas como ON:

    • ANSI_NULLS

    • ANSI_PADDING

    • ANSI_WARNINGS

    • ARITHABORT

    • CONCAT_NULL_YIELDS_NULL

    • QUOTED_IDENTIFIER

    • A opção de sessão NUMERIC_ROUNDABORT é definida como OFF.

  • O otimizador de consulta encontra uma correspondência entre os elementos e as colunas de índice de exibição na consulta, tais como:

    • Predicados de critérios de pesquisa na cláusula WHERE

    • Operações de união

    • Funções de agregação

    • Cláusulas GROUP BY

    • Referências de tabela

  • O custo estimado do uso do índice é o custo mais baixo de qualquer mecanismo de acesso considerado pelo otimizador de consulta.

  • Toda tabela referenciada na consulta (diretamente ou ao expandir uma exibição para acessar suas tabelas subjacentes) que corresponde a uma referência de tabela na exibição indexada deve ter o mesmo conjunto de dicas aplicado na consulta.

    ObservaçãoObservação

    As dicas READCOMMITTED e READCOMMITTEDLOCK sempre são dicas diferentes consideradas nesse contexto, independentemente do nível de isolamento da transação atual.

Diferentemente dos requisitos das opções SET e dicas de tabela, essas são as mesmas regras que o otimizador de consulta usa para determinar se um índice de tabela abrange uma consulta. Não é necessário especificar mais nada na consulta para uma exibição indexada a ser utilizada.

Uma consulta não precisa referenciar explicitamente uma exibição indexada na cláusula FROM para que o otimizador de consulta use a exibição indexada. Se a consulta tiver referências a colunas nas tabelas base, que também estão presentes na exibição indexada, e o otimizador de consulta estimar que o uso da exibição indexada fornecerá o menor custo de mecanismo de acesso, o otimizador de consulta escolherá a exibição indexada, semelhante ao modo pelo qual escolhe índices de tabela base quando eles não são referenciados diretamente em uma consulta. O otimizador de consulta pode escolher a exibição quando ela contém colunas que não são referenciadas pela consulta, contanto que a exibição ofereça a opção de menor custo para cobrir uma ou mais das colunas especificadas na consulta.

O otimizador de consulta trata uma exibição indexada referenciada na cláusula FROM como uma exibição padrão. O otimizador de consulta expande a definição da exibição da consulta no início do processo de otimização. Depois, a correspondência da exibição indexada é executada. A exibição indexada pode ser usada no plano de execução final selecionado pelo otimizador ou, em vez disso, o plano pode materializar os dados necessários da exibição acessando as tabelas base referenciadas pela exibição. O otimizador escolhe a alternativa de menor custo.

Usando dicas com exibições indexadas

Você pode evitar que os índices de exibições sejam usados para uma consulta usando a dica de consulta EXPAND VIEWS. Ou, então, pode usar a dica de tabela NOEXPAND para forçar o uso de um índice para uma exibição indexada especificada na cláusula FROM de uma consulta. Porém, deve deixar o otimizador de consulta determinar dinamicamente os melhores métodos de acesso a serem usados para cada consulta. Limite seu uso de EXPAND e NOEXPAND a casos específicos em que os testes têm mostrado que melhoram o desempenho significativamente.

A opção EXPAND VIEWS especifica que o otimizador de consulta não usa nenhum índice de exibição para a consulta inteira.

Quando NOEXPAND é especificado para uma exibição, o otimizador de consulta considera o uso de qualquer índice definido na exibição. O NOEXPAND especificado com a cláusula INDEX () opcional força o otimizador de consulta a usar os índices especificados. O NOEXPAND pode ser especificado apenas para uma exibição indexada e não pode ser especificado para uma exibição não indexada.

Quando NOEXPAND nem EXPAND VIEWS é especificado em uma consulta que contém uma exibição, a exibição é expandida para acessar as tabelas subjacentes. Se a consulta que compõe a exibição tiver quaisquer dicas de tabela, as dicas serão propagadas às tabelas subjacentes. (Esse processo é explicado com mais detalhes em Resolução de exibição.) Contanto que o conjunto de dicas existente nas tabelas subjacentes da exibição sejam idênticos, a consulta será elegível para ser correspondida a uma exibição indexada. Na maioria das vezes, essas dicas corresponderão umas às outras porque estão sendo diretamente herdadas da exibição. No entanto, se a consulta referenciar tabelas em vez de exibições e as dicas aplicadas diretamente nessas tabelas não forem idênticas, a consulta não será elegível para correspondência com uma exibição indexada. Se as dicas INDEX, PAGLOCK, ROWLOCK, TABLOCKX, UPDLOCK ou XLOCK forem aplicadas às tabelas referenciadas na consulta depois da expansão da exibição, a consulta não será elegível para a correspondência da exibição indexada.

Se uma dica de tabela no formulário de INDEX (index_val [,... n] ) fizer referência a uma exibição em uma consulta e você não especificar a dica NOEXPAND, a dica de índice será ignorada. Para especificar o uso de um determinado índice, use NOEXPAND.

Geralmente, quando o otimizador de consulta corresponde uma exibição indexada a uma consulta, as dicas especificadas nas tabelas ou exibições da consulta são aplicadas diretamente à exibição indexada. Se o otimizador de consulta optar por não usar uma exibição indexada, qualquer dica será propagada diretamente às tabelas referenciadas na exibição. Para obter mais informações, consulte Resolução de exibição. Essa propagação se aplica a dicas de união. Elas são aplicadas somente em sua posição original na consulta. As dicas de união não são consideradas pelo otimizador de consulta quando há correspondência entre as consultas e as exibições indexadas. Se um plano de consulta usar uma exibição indexada que corresponde a parte de uma consulta que contém uma dica de união, a dica de união não será usada no plano.

Não são permitidas dicas nas definições de exibições indexadas no SQL Server 2008. No modo de compatibilidade 80 e superior, o SQL Server ignora as dicas em definições de exibição indexada quando as mantêm, ou ao executar consultas que usam exibições indexadas. Embora o uso de dicas em definições de exibição indexada não produza um erro de sintaxe no modo de compatibilidade 80, elas são ignoradas.