Tengo una tabla y una vista indizada 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
Ahora si ejecuto la siguiente consulta
select a.name, b.name
from mytable1 a
join mytable2 b on a.Id = b.Id
No usa mi vista indizada. ¿Hay alguna pista (u otra forma) para obligar a SQL Server a usar la vista indizada?
Tengo un gran sistema y necesito optimizarlo. 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.
Estoy usando SQL Server 2014 Enterprise Edition.
sql-server
sql-server-2014
materialized-view
Artashes Khachatryan
fuente
fuente
Respuestas:
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.
Como no hay índice en esta vista, escaneamos las tablas base:
Pero una vez que agregamos un índice, el optimizador puede usarlo:
Esto usó apropiadamente la vista:
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.
fuente
Si no puede cambiar el código de su aplicación a nuevos nombres de objeto, ¿tal vez pueda cambiar el usuario de su aplicación para usar un nuevo esquema predeterminado y crear las vistas indexadas en otro esquema usando los mismos nombres de objeto? Por ejemplo:
Por supuesto, esto solo funcionará si no ha utilizado los nombres de esquema en el código de la aplicación.
Si es así, puede intentar mover todos los objetos a un nuevo esquema e introducir las vistas en el esquema anterior.
fuente