2010-12-13 38 views
2

J'ai créé une vue indexée (MyView) qui se compose de trois colonnes:SQL Server 2008 R2 et plan d'exécution dans la vue indexée

Table1_ID (int not null) 
Object_CreationDate (datetime, null) 
Objec_Count(bigint null) 

J'ai créé index unique cluster IX_1 sur deux colonnes: Table1_ID Et Object_CreationDate

Je veux courir deux requêtes:
1.

Select * from [dbo].MyView 
where Table1_ID = 10 

2.

Select * from [dbo].MyView 
where Table1_ID = 10 
AND Object_CreationDate <= GETDATE() 

requête 1-st court vite (même avec DBCC DROPCLEANBUFFERS()) et utiliser le plan d'exécution simple via l'utilisation MyView et IX_1
requête 2 e exécute pas si vite parce que il utilise le plan d'exécution « vieux » (recherche par plusieurs index dans trois tableaux et mise en boucle imbriquée)

Je comprends mal cette situation. Quant à moi, il est naturel d'utiliser IX_1 et MyView pour la requête 2-nd.
De plus, j'attends cette requête 2 e exécute la même vitesse ou encore plus vite alors 1-er, car il utilise deux colonnes dans la clause where qui sont en index ordonné en clusters.

J'ai essayé course de 2 ème requête with(index=IX_1) et les statistiques de mise à jour des colonnes, mais toujours le même plan d'exécution.

Est-il possible de forcer l'utilisation de SQL MyView ET IX_1?

Répondre

6

À moins que vous utilisez Enterprise/Developer Edition, vous devez inclure les WITH NOEXPAND hint

Select * from [dbo].MyView WITH (NOEXPAND) 
where Table1_ID = 10 
AND Object_CreationDate <= GETDATE() 

De Designing Indexed Views:

vues indexées peuvent être créées dans une édition de SQL Server 2008. Dans SQL Server 2008 Enterprise, l'optimiseur de requête considère automatiquement la vue indexée. Pour utiliser une vue indexée dans toutes les autres éditions, l'indicateur de table NOEXPAND doit être utilisé.

(Et Developer Edition est essentiellement Enterprise Edition, avec des licences différentes)

+1

J'étonné que vous savez ces propriétés de studio de gestion. –