Construyo vistas indexadas en SQL Server todo el tiempo para ajustar los productos existentes. El optimizador es lo suficientemente inteligente como para usar el índice si está utilizando las columnas apropiadas.
Usando su ejemplo, parece que creó la vista pero en realidad no creó un índice sobre ella.
if object_id(N'mytable1') is not null
drop table mytable1
if object_id(N'mytable2') is not null
drop table mytable2
go
Create table mytable1 (ID int identity(1,1), Name1 nvarchar(100))
GO
Create table mytable2 (ID int identity(1,1), Name2 nvarchar(100))
GO
insert into mytable1 values ('steve')
insert into mytable1 values ('jack')
insert into mytable1 values ('mike')
insert into mytable1 values ('ralph')
insert into mytable1 values ('simon')
insert into mytable2 values ('smith')
insert into mytable2 values ('jackson')
insert into mytable2 values ('mikaelson')
insert into mytable2 values ('montalvo')
insert into mytable2 values ('singer')
go
if object_id(N'myview') is not null
drop view myview
go
Create view myview
with schemabinding
as
select a.id, a.name1, b.name2
from dbo.mytable1 a
join dbo.mytable2 b on a.Id = b.Id
GO
select a.name1, b.name2
from mytable1 a join mytable2 b on a.Id = b.Id
GO
Como no hay índice en esta vista, escaneamos las tablas base:
Pero una vez que agregamos un índice, el optimizador puede usarlo:
CREATE UNIQUE CLUSTERED INDEX [ix_cl_names] ON [myview]
(
[name1] ASC,
[name2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Esto usó apropiadamente la vista:
No puedo cambiar todos mis scripts SQL para seleccionar desde la vista en lugar de las tablas. Quiero crear vistas indexadas y forzar a SQL Server a obtener datos de ellas en lugar de tablas.
No hay ninguna sugerencia u otro método para obligar a SQL Server a usar una vista indizada cuando no se hace referencia en la consulta.
Información adicional (de Geoff Patterson )
Un punto adicional es que si bien el optimizador puede, solo en Enterprise Edition, usar la vista indexada en este caso, puede tener sentido hacer referencia directa a la vista usando la NOEXPAND
sugerencia si necesita estar 100% seguro del índice de vista que se está utilizando o si alguna vez quieres que se use en Standard Edition.
Con frecuencia he visto consultas incluso en Enterprise Edition donde el optimizador no detecta el hecho de que el índice de vista se puede usar a menos que NOEXPAND
se use. Es más común con consultas complejas, pero también puede ocurrir con consultas simples.
Paul White tiene uno de los mejores artículos que he leído explorando los matices de NOEXPAND
; más allá del uso del índice de vista, la sugerencia también puede afectar cosas como si las estadísticas se crean automáticamente en la vista indexada y las estimaciones de cardinalidad para el plan.
Y de Zane : como nota al margen, tenga cuidado con las vistas indexadas como cualquier otro índice que agregará a sus tiempos de actualización, inserción y eliminación.