Ausführungsplan mit fehlendem Index, aber schnelle Abfrage


8

Beim Betrachten eines tatsächlichen Ausführungsplans werden fehlende Indizes angezeigt, obwohl die Abfrage weniger als 1 Sekunde dauert.

SELECT
    Account.AccountID,
    Account.Name
FROM
    account      
    LEFT OUTER JOIN accountfeaturesetting afs 
ON afs.accountid = account.accountid   
and afs.featureid = 'Schedules'
 and  
afs.settingid = 'EditReasons'           
WHERE
    ISNULL(afs.Value, '0') = '0'  
    AND EXISTS 
(SELECT 1 FROM program WHERE program.AccountID = account.AccountID
 AND program.Active = 1 
AND (program.ScheduleEditReasonFlags <> 0 
OR program.ScheduleEditReasonFields <> 0))
    AND account.IsMaster = 0
    AND account.BeginDate IS NOT NULL

Der Ausführungsplan zeigt:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Account] ([IsMaster],[BeginDate])
INCLUDE ([AccountID],[Name])

Müssen wir den Index erstellen, obwohl die Abfrage nur 1 Sekunde dauert? Auf welcher Basis soll ein Index erstellt werden?

Ich werde diese Abfrage als täglichen Job ausführen.


1
Ist eine Sekunde schnell genug?
Erik Darling

Es dauert weniger als 1 Sekunde
am

4
Okay ... ist das schnell genug?
Erik Darling

Ich denke, es ist schnell, da die Kontotabelle 900 Zeilen hat. Und das Kontofeatureset hat 21385 Zeilen
am

1
Ich würde sagen, fügen Sie mehr Zeilen wie 100x mehr hinzu, als Sie tatsächlich in einer Testdatenbank haben, und veröffentlichen Sie den tatsächlichen Ausführungsplan. Veröffentlichen Sie es dann erneut, nachdem Sie diesen Index hinzugefügt haben, und Sie werden sehen und erfahren, warum andere empfehlen, diesen Index anzuwenden oder nicht.
Magier

Antworten:


15

Sie müssen den Index jetzt nicht hinzufügen. Die Meldung "Fehlender Index" bedeutet lediglich, dass dies hilfreich sein kann. Es könnte nicht ehrlich sein, oder es könnte einen Index geben, der noch mehr hilft.

Was , wenn Sie benötigen den neuen Index hinzufügen? Nehmen wir an, Sie haben 100 Zeilen in der Kontotabelle, aber sie wird noch nicht wirklich verwendet. In ein paar Monaten sind Sie bis zu 10.000 Zeilen und die Abfrage dauert jetzt eine halbe Stunde oder länger. An diesem Punkt können Sie den Index hinzufügen. Und wenn ich überlege, meine ich, teste es in einer Testumgebung und schau, ob es tatsächlich die Dinge verbessert.

Weitere Überlegungen umfassen:

  • Wie viele Indizes habe ich bereits in dieser Tabelle? Wenn Sie mehr als 10 Indizes haben, wäre ich besorgter, als wenn Sie 2 gesagt hätten.
  • Wie wichtig ist diese Abfrage? Sie sagen, Sie führen es jede Nacht. Bei 1 Sekunde ist das in Ordnung (vorausgesetzt, Sie führen es nur einmal aus). Wenn es andererseits Teil eines Prozesses ist und jede Nacht 1000 Mal ausgeführt wird, ist es möglicherweise eher ein Problem. Wenn es zu einem Punkt kommt, an dem es lange genug dauert, um Probleme zu verursachen (Probleme mit einem anderen Prozess zu verursachen oder wenn Benutzer im System sind usw.), müssen Sie die Leistung überprüfen und Indizes hinzufügen.

Es lohnt sich auch zu fragen, wie viele Konten Sie voraussichtlich haben. Wenn Sie Bestellungen für Jetliner entgegennehmen, haben Sie möglicherweise nicht so viele Kunden, aber wenn es sich um eine Social-Media-Site handelt, ist es Ihr Hauptziel, diese Zahl so schnell wie möglich in die Millionen zu bringen. Noch etwas - In einigen Fällen würde ich mich jetzt dazu neigen, den Index zu erstellen, damit ich nicht ein Jahr später nach dem suchen muss, was die Anwendung verlangsamt, wenn die Anzahl der Konten aus irgendeinem Grund abnimmt.
msouth
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.