SQL Server 2008 R2 und Ausführungsplan in der indizierten Sicht
-
09-10-2019 - |
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
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()
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)