Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Instruction SQL - Comment améliorer la vitesse avec l'indexation

Cet index sera probablement utile, mais gardez à l'esprit qu'il n'y a pas de repas gratuit (les index doivent être maintenus, cela affectera donc votre charge de travail d'insertion/mise à jour/suppression) :

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID)
  INCLUDE (MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND OnHold = 0
  AND ToArchivedFlag = 0;

Maintenant, votre requête peut dire :

SELECT TOP (1) MemberMailID
  FROM dbo.MemberMail -- dbo prefix
    WITH (INDEX (unread_emails)) -- in case you need to force, though you should not
WHERE ToMemberID = 102
AND ToReadFlag = 0
AND ToDeletedFlag = 0
AND FromDeletedFlag = 0
AND OnHold = 0
AND ToArchivedFlag = 0
ORDER BY ToMemberID; -- ORDER BY is important!

Si vous modifiez les valeurs de certains de ces drapeaux en fonction de la requête, vous pouvez essayer d'ajouter ces colonnes à la clé de l'index au lieu du filtre, par ex. disons que parfois vous vérifiez OnHold = 0 et parfois OnHold = 1 :

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID, OnHold)
  INCLUDE (MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND ToArchivedFlag = 0;

Vous pouvez également essayer d'avoir MemberMailID dans la clé au lieu de INCLUDE . par exemple :

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID, MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND OnHold = 0
  AND ToArchivedFlag = 0;

Ces différences peuvent ne pas avoir d'importance pour vos données et vos habitudes d'utilisation, mais vous pourrez tester les différences plus facilement que nous ne pourrons le deviner.