Warum wird mein Planungsleitfaden nicht verwendet?


9

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 IDSpalte ist Clustered Index und Throwtimehat Nonclustered Index. In diesem Fall haben wir festgestellt, dass throwtimeanstelle 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

Wie sieht der nicht gruppierte Index aus? Der Grund, warum der Server dies ignoriert, ist, dass er nicht glaubt, dass es etwas nützt. Entweder Sie haben einen fehlerhaften Plan oder einen fehlerhaften Index
Allan S. Hansen

3
Nebenbei bemerkt, BITTE BITTE ändern Sie sich throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'zu throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';- bitte lesen Sie diesen Blog-Beitrag und auch diesen .
Aaron Bertrand

@ AaronBertrand Vielen Dank. Ja, ich habe diese Änderung ebenfalls vorgeschlagen und sie werden es in der nächsten Version schaffen.
RK Kuppala

Antworten:


11

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.