Wir sind kürzlich auf das Problem mit dem Wendepunkt gestoßen, und einige unserer Berichtsabfragen, die die Ausführung innerhalb weniger Sekunden abgeschlossen haben, dauern jetzt mehr als 2 Minuten, da das Abfrageoptimierungsprogramm den nicht gruppierten Index in der Suchspalte einfach ignoriert. Eine Beispielabfrage unten:
select top 100 *
from [dbo].[t_Call]
where ID > 0
and throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id
Die ID
Spalte ist Clustered Index und Throwtime
hat Nonclustered Index. In diesem Fall haben wir festgestellt, dass throwtime
anstelle von ID
Änderungen der Abfrageplan und der nicht gruppierte Index sortiert werden. Wir planen auch, einige der alten Daten zu archivieren (derzeit sind 20 Mio. Zeilen vorhanden !!). Das Vornehmen dieser Änderungen in der Anwendung wird jedoch einige Zeit in Anspruch nehmen, und ich muss einen Weg finden, um Berichte relativ schnell auszuführen, ohne Änderungen auf Anwendungsebene vorzunehmen (na ja, so ist das Leben!).
Planführer eingeben. Ich habe den folgenden Planleitfaden mit einem Hinweis zur nicht gruppierten Indexabfrage erstellt. Aus irgendeinem Grund wird der nicht gruppierte Index immer noch nicht verwendet. Vermisse ich etwas
EXEC sp_create_plan_guide
@name = N'[prod2reports_callthrowtime]',
@stmt = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL',
@module_or_batch = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@params = N'@0 int, @1 datetime, @2 datetime',
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO
quelle
throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
zuthrowtime >= '20140320 07:00' AND throwtime < '20140324 07:00';
- bitte lesen Sie diesen Blog-Beitrag und auch diesen .Antworten:
Die Abfrage muss genau übereinstimmen, einschließlich Leerzeichen. Ich schlage vor, Sie holen die Abfrage aus dem Cache und erstellen sie daraus, anstatt sie auf andere Weise einzugeben.
quelle
LESEN SIE IHREN VERBUNDENEN ARTIKEL WIEDER
Das Schreiben eines Planleitfadens, um die Verwendung Ihres Index zu erzwingen, ist mit ziemlicher Sicherheit nicht das, was Sie möchten, da dadurch ineffiziente Lesezeichensuchen erzwungen werden. Gemäß Ihrem Artikel besteht die richtige Lösung für die effizienteste Ausführung dieser Abfrage darin, Ihren Index so zu ändern, dass er einen nicht gruppierten Index abdeckt. Mit anderen Worten, fügen Sie entweder alle Spalten aus Ihrer Tabelle zum Index hinzu oder (vorzugsweise) ) Fügen Sie einfach die Spalten hinzu, die Sie für diese Abfrage benötigen, und ändern Sie dann die Auswahl, um nur diese Spalten abzurufen.
quelle