Plan d'exécution montrant l'index manquant mais la requête est rapide

8

Tout en regardant un plan d'exécution réel, il montre des index manquants même si la requête prend moins d'une seconde.

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

Le plan d'exécution montre:

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

Avons-nous besoin de créer l'index même si la requête ne prend qu'une seconde? Sur quelle base un indice doit-il être créé?

Je vais exécuter cette requête comme un travail quotidien.

somu
la source
1
Une seconde est-elle assez rapide?
Erik Darling
Cela prend moins d'une seconde
somu
4
D'accord ... est-ce assez rapide?
Erik Darling
Je pense donc que sa rapide table de compte a 900 compte rows.and featuresetting a 21385 lignes
SOMU
1
Je dirais ajouter plus de lignes comme 100 fois plus que vous n'en avez réellement dans une base de données de test et publier le plan d'exécution réel. Ensuite, postez-le à nouveau après avoir ajouté cet index et vous verrez et apprendrez pourquoi d'autres se renommeraient pour appliquer ou non cet index.
Magier

Réponses:

15

Vous n'avez pas besoin d'ajouter l'index pour le moment. Tout le message "index manquant" signifie que cela pourrait être utile. Ce n'est peut-être pas honnêtement, ou il peut y avoir un indice qui aide encore plus.

Quant à savoir quand vous devez ajouter le nouvel index? Supposons que vous ayez 100 lignes dans le tableau des comptes, mais qu'elles ne sont pas encore vraiment utilisées. En quelques mois, vous avez jusqu'à 10 000 lignes et la requête prend maintenant une demi-heure ou plus. À ce stade, vous pourriez envisager d'ajouter l'index. Et quand je dis considérer, je veux dire le tester dans un environnement de test et voir si cela améliore réellement les choses.

D'autres considérations incluent:

  • Combien d'index ai-je déjà sur cette table? Si vous avez plus de 10 index, je serais plus préoccupé que si vous aviez dit 2.
  • Quelle est l'importance de cette requête? Vous dites que vous l'exécutez tous les soirs. À 1 seconde, c'est bien (en supposant que vous ne l'exécutiez qu'une seule fois). Si d'un autre côté, cela fait partie d'un processus et qu'il est exécuté des milliers de fois chaque nuit, cela pourrait être plus problématique. Si cela arrive à un point où cela prend suffisamment de temps pour vous causer des problèmes (causer des problèmes avec un autre processus, ou se heurter à des moments où les utilisateurs sont dans le système, etc.), vous devez regarder les performances et ajouter des index.
Kenneth Fisher
la source
Il convient également de demander combien de comptes vous prévoyez d'avoir. Si vous prenez des commandes de avions de ligne, vous n'aurez peut-être pas une énorme base de clients, mais s'il s'agit d'un site de réseau social, votre objectif principal est d'obtenir ce nombre en millions le plus rapidement possible. Une dernière chose - dans certains cas, je pencherais pour la création de l'index maintenant afin de ne pas avoir à chercher ce qui ralentit l'application un an plus tard lorsque le nombre de comptes décolle pour une raison quelconque.
msouth