Eu tenho uma tabela e uma exibição indexada nela como
Create table mytable1 (ID int identity(1,1), Name nvarchar(100))
Create table mytable2 (ID int identity(1,1), Name nvarchar(100))
Create view myview
with schemabinding
as
select a.name, b.name
from mytable1 a
join mytable2 b on a.Id = b.Id
Agora, se eu executar a seguinte consulta
select a.name, b.name
from mytable1 a
join mytable2 b on a.Id = b.Id
Ele não usa minha exibição indexada. Existe alguma dica (ou outra maneira) para forçar o SQL Server a usar a exibição indexada?
Eu tenho um grande sistema e preciso otimizá-lo. Não consigo alterar todos os meus scripts SQL para selecionar na exibição em vez de tabelas. Quero criar modos de exibição indexados e forçar o SQL Server a obter dados deles em vez de tabelas.
Estou usando o SQL Server 2014 Enterprise Edition.
sql-server
sql-server-2014
materialized-view
Artashes Khachatryan
fonte
fonte
Respostas:
Eu construo modos de exibição indexados no SQL Server o tempo todo para ajustar os produtos existentes. O otimizador é inteligente o suficiente para usar o índice se você estiver utilizando as colunas apropriadas.
Usando seu exemplo, parece que você criou a visualização, mas na verdade não criou um índice.
Como não há índice nessa exibição, verificamos nas tabelas base:
Mas depois que adicionamos um índice, o otimizador pode usá-lo:
Isso usou adequadamente a exibição:
Não há dica ou outro método para forçar o SQL Server a usar uma exibição indexada quando ela não é referenciada na consulta.
Informações adicionais (de Geoff Patterson )
Um ponto extra é que, embora o otimizador possa, apenas no Enterprise Edition, usar a exibição indexada nesse caso, pode fazer sentido referenciar diretamente a exibição usando a
NOEXPAND
dica, se você precisar ter 100% de certeza do índice de exibição que está sendo usado ou se você quiser que ele seja usado na Standard Edition.Frequentemente, tenho visto consultas, mesmo no Enterprise Edition, em que o otimizador não entende o fato de que o índice de exibição pode ser usado, a menos que
NOEXPAND
seja usado. É mais comum em consultas complexas, mas também pode ocorrer em consultas simples.Paul White tem um dos melhores artigos que li explorando as nuances de
NOEXPAND
; além do uso do índice de exibição, a dica também pode afetar coisas como se as estatísticas são criadas automaticamente na exibição indexada e nas estimativas de cardinalidade do plano.E do Zane : como uma observação lateral, tenha cuidado com as exibições indexadas, como qualquer outro índice que ele adicionará às horas de atualização, inserção e exclusão.
fonte
Se você não pode alterar o código do aplicativo para novos nomes de objeto, talvez seja possível alterar o usuário do aplicativo para usar um novo esquema padrão e criar as visualizações indexadas em outro esquema usando os mesmos nomes de objeto? Por exemplo:
Obviamente, isso funcionará apenas se você não tiver usado os nomes dos esquemas no código do aplicativo.
Se você tiver, tente mover todos os objetos para um novo esquema e, em vez disso, introduza as visualizações no esquema antigo.
fonte