Piano di esecuzione che mostra l'indice mancante ma la query è veloce


8

Mentre osserva un piano di esecuzione effettivo, mostra gli indici mancanti anche se la query impiega meno di 1 secondo.

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

Il piano di esecuzione mostra:

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

Dobbiamo creare l'indice anche se la query impiega solo 1 secondo? Su quale base dovrebbe essere creato un indice?

Eseguirò questa query come lavoro quotidiano.


1
Un secondo è abbastanza veloce?
Erik Darling,

Ci vuole meno di 1 secondo
circa il

4
Va bene ... è abbastanza veloce?
Erik Darling,

Penso che sia veloce poiché la tabella degli account ha 900 righe e l'impostazione delle funzionalità dell'account ha 21385 righe
circa

1
Direi di aggiungere più righe come 100x in più di quelle effettivamente presenti in un db di prova e di pubblicare l'attuale piano di esecuzione. quindi Pubblica di nuovo dopo aver aggiunto questo indice e vedrai e scoprirai perché gli altri raccomanderebbero o meno di applicare questo indice.
Magier,

Risposte:


15

Non è necessario aggiungere l'indice in questo momento. Tutto il messaggio "indice mancante" indica che questo potrebbe essere utile. Potrebbe non essere onesto o potrebbe esserci un indice che aiuta ancora di più.

Per quanto riguarda quando è necessario aggiungere il nuovo indice? Bene, supponiamo che tu abbia 100 righe nella tabella degli account, ma non è ancora veramente in uso. In un paio di mesi si arriva a 10.000 righe e la query impiega ora mezz'ora o più. A quel punto potresti considerare di aggiungere l'indice. E quando dico di considerare, intendo testarlo in un ambiente di test e vedere se effettivamente migliora le cose.

Altre considerazioni includono:

  • Quanti indici ho già su questa tabella? Se hai più di 10 indici, sarei più preoccupato che se avessi detto 2.
  • Quanto è importante questa query? Dici di gestirlo ogni notte. A 1 secondo va bene (supponendo che tu lo esegua solo una volta). Se d'altra parte fa parte di un processo e viene eseguito migliaia di volte ogni notte, potrebbe essere più un problema. Se arriva a un punto in cui sta impiegando abbastanza tempo per causare problemi (causando problemi con un altro processo o incappando in momenti in cui gli utenti si trovano nel sistema, ecc.) Allora devi guardare le prestazioni e aggiungere indici.

Vale anche la pena chiedere quanti account ti aspetti di avere. Se stai prendendo ordini per aerei di linea, potresti non avere una vasta base di clienti, ma se si tratta di un sito di social media il tuo obiettivo principale è quello di ottenere quel numero in milioni il più rapidamente possibile. Ancora una cosa: in alcuni casi mi spingerei a creare l'indice ora in modo da non dover cercare ciò che sta rallentando l'applicazione un anno dopo quando il numero di account decolla per qualche motivo.
msouth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.