Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Istruzione SQL - Come è possibile migliorare la velocità con l'indicizzazione

Questo indice sarà probabilmente utile, ma tieni presente che non ci sono pranzi gratuiti (gli indici devono essere mantenuti, quindi ciò influirà sul tuo carico di lavoro di inserimento/aggiornamento/eliminazione):

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;

Ora la tua domanda può 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!

Se modifichi i valori di alcuni di questi flag a seconda della query, puoi provare ad aggiungere quelle colonne alla chiave dell'indice anziché al filtro, ad es. diciamo che a volte controlli OnHold = 0 e talvolta 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;

Potresti anche voler sperimentare con MemberMailID nella chiave invece di INCLUDE . es.:

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;

Queste differenze potrebbero non essere importanti per i tuoi dati e i tuoi modelli di utilizzo, ma sarai in grado di testare le differenze più facilmente di quanto possiamo immaginare.