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

¿Fue útil?

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()

Diseñar vistas indizadas :

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top