2008 R2 y plan de ejecución de SQL Server en la vista indizada
-
09-10-2019 - |
Pregunta
He creado una vista indizada ( MyView ) que consta de tres columnas:
Table1_ID (int not null)
Object_CreationDate (datetime, null)
Objec_Count(bigint null)
He creado índice único agrupado IX_1 en dos columnas: Table1_ID
Y Object_CreationDate
Quiero ejecutar dos consultas:
1.
Select * from [dbo].MyView
where Table1_ID = 10
2.
Select * from [dbo].MyView
where Table1_ID = 10
AND Object_CreationDate <= GETDATE()
consulta 1-st corre rápido (incluso con DBCC DROPCLEANBUFFERS () ) y el uso del plan de ejecución sencilla mediante el uso de MyView y IX_1
consulta se ejecuta 2-nd no tan rápido, ya que utiliza el plan de ejecución "viejo" (que buscan por varios índices en tres mesas y un bucle anidado)
Me entienden mal esta situación. En cuanto a mí, es el uso natural de IX_1 Y MyView de 2-nd consulta.
Por otra parte, espero que consulta 2-nd corre a la misma velocidad o incluso más rápido que 1-st, ya que utiliza dos columnas en la cláusula where que están en índice agrupado.
He intentado ejecutar estadísticas 2-nd with(index=IX_1)
consulta y actualización de columnas, pero todavía tienen el mismo plan de ejecución.
¿Es posible forzar el uso de SQL MyView y IX_1
Solución
A menos que utilice la edición Enterprise / desarrollador, es necesario incluir la CON sugerencia NOEXPAND
Select * from [dbo].MyView WITH (NOEXPAND)
where Table1_ID = 10
AND Object_CreationDate <= GETDATE()
Las vistas indizadas se pueden crear en cualquier edición de SQL Server 2008. En SQL Server 2008 Enterprise, el optimizador de consultas tiene en cuenta automáticamente la vista indizada. Para utilizar una vista indizada en todas las otras ediciones, la sugerencia de tabla NOEXPAND debe ser utilizado.
(Y Developer Edition es básicamente Enterprise Edition, con diferentes licencias)