Domanda

Ho creato una vista indicizzata ( MyView ) che si compone di tre colonne:

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

Ho creato indice univoco cluster IX_1 su due colonne: Table1_ID E Object_CreationDate

Voglio correre due query:
1.

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

2.

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

query di 1-st corre veloce (anche con DBCC DROPCLEANBUFFERS () ) e utilizzare semplici piano di esecuzione tramite utilizzando MyView e IX_1
interrogazione viene eseguita 2-ND non così in fretta perché utilizza "vecchio" piano di esecuzione (che cercano da diversi indici in tre tabelle e loop annidato)

I comprendono male questa situazione. Per quanto mi riguarda, è l'uso naturale IX_1 e MyView per 2-nd query.
Inoltre, aspetto quella query 2-nd corre alla stessa velocità o anche più velocemente allora 1-st, perché utilizza due colonne in cui la clausola che sono indice cluster.

Ho provato eseguire 2-nd interrogazione with(index=IX_1) e aggiornare le statistiche per colonne, ma ancora lo stesso piano di esecuzione.

E 'possibile forzare l'uso di sql MyView e IX_1

È stato utile?

Soluzione

A meno che non si sta utilizzando versione Enterprise / Developer, è necessario includere il CON suggerimento NOEXPAND

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

Progettazione viste indicizzate :

  

Le viste indicizzate possono essere creati in qualsiasi edizione di SQL Server 2008. In SQL Server 2008 Enterprise, Query Optimizer considera automaticamente la vista indicizzata. Per utilizzare una vista indicizzata in tutte le altre edizioni, deve essere utilizzato il suggerimento tavolo NOEXPAND.

(E Developer Edition è fondamentalmente Enterprise Edition, con licenza diversa)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top