sql >> Base de Datos >  >> RDS >> Sqlserver

Declaración SQL:cómo puede mejorar la velocidad con la indexación

Este índice probablemente será útil, pero tenga en cuenta que no hay almuerzo gratis (los índices deben mantenerse, por lo que esto afectará su carga de trabajo de inserción/actualización/eliminación):

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;

Ahora su consulta puede decir:

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 cambia los valores de algunas de estas banderas según la consulta, puede experimentar agregando esas columnas a la clave del índice en lugar del filtro, p. digamos que a veces verifica OnHold = 0 ya veces 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;

También puede experimentar con tener MemberMailID en la clave en lugar de INCLUDE . por ejemplo:

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;

Es posible que estas diferencias no importen para sus datos y patrones de uso, pero podrá probar las diferencias más fácilmente de lo que podremos adivinar.