Frage

Ich habe eine indizierte Sicht erstellt ( MyView ), das aus drei Säulen besteht:

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

Ich habe erstellt gruppierten eindeutigen Index IX_1 auf zwei Säulen: Table1_ID Und Object_CreationDate

Ich möchte zwei Abfragen ausführen:
1.

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

2.

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

1-st-Abfrage läuft schnell (auch mit DBCC DROPCLEANBUFFERS () ) und mit einfachen Ausführungsplan MyView über Verwendung und IX_1
2-nd Abfrage läuft nicht so schnell, weil es „alten“ Ausführungsplan (sucht nach mehreren Indizes in drei Tabellen und verschachteltes Looping) verwendet

ich falsch verstehen diese Situation. Was mich betrifft, ist es natürlich Gebrauch IX_1 Und MyView für 2-nd-Abfrage.
Außerdem warte ich, dass 2-nd Abfrage läuft die gleiche Geschwindigkeit oder sogar schneller als 1-st, denn es verwendet zwei Spalten in where-Klausel , die in Clustered-Index sind.

Ich habe versucht, laufen 2-nd Abfrage with(index=IX_1) und Aktualisierung der Statistiken für Spalten, aber immer noch die gleichen Ausführungsplan haben.

Ist es möglich, SQL verwenden zu zwingen MyView und IX_1

War es hilfreich?

Lösung

Wenn Sie nicht gerade mit Enterprise / Developer Edition, müssen Sie die MIT enthalten NOEXPAND Hinweis

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

Designing indizierte Views :

Indizieren Sichten können in einem beliebigen Edition von SQL Server 2008 in SQL Server 2008 Enterprise, die Abfrage-Optimierer berücksichtigen automatisch die indizierte Sicht erstellt werden. Um eine indizierte Sicht in allen anderen Editionen zu verwenden, muss der NOEXPAND Tabellenhinweis verwendet werden.

(Und Developer Edition ist im Grunde Enterprise Edition, mit verschiedener Lizenz)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top